Hello, I’m new here and need some help about cakephp 3 and HABTM,
I need to save 3 foreign keys in pivot table “gruposusuarios_menus”.
The code below work but when the user change the logged company “empresa_id” and update the group (gruposuuario) all records about the last company (empresa_id=1) are deleted and save the new company “empresa_id = 11”.
Thanks.
gruposusuarios
±—±----------------+
| id | nome |
±—±----------------+
| 1 | Administradores |
| 7 | Financeiro |
±—±----------------+
menus
±—±-------------------------------------+
| id | menu |
±—±-------------------------------------+
| 1 | Cadastros |
| 2 | CadastrosGeral |
| 3 | CadastrosVincular |
±—±-------------------------------------+
empresas
±—±-----------------+
| id | nome |
±—±-----------------+
| 1 | Empresa 1 |
| 11 | Empresa 2 |
±—±-----------------+
gruposusuarios_menus
±----±-----------±---------±--------+
| id | empresa_id | grupo_id | menu_id |
±----±-----------±---------±--------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 2 |
| 3 | 1 | 1 | 3 |
| 4 | 11 | 7 | 1 |
| 5 | 11 | 7 | 2 |
±----±-----------±---------±--------+
class GruposUsuariosTable extends Table
{
$this->belongsToMany('Menus', [
'foreignKey' => 'grupo_id',
'targetForeignKey' => 'menu_id',
'joinTable' => 'gruposusuarios_menus',
'through' => 'GruposUsuariosMenus'
]);
}
class MenusTable extends Table
{
$this->belongsToMany('GruposUsuarios', [
'foreignKey' => 'menu_id',
'targetForeignKey' => 'grupo_id',
'joinTable' => 'gruposusuarios_menus',
'through' => 'GruposUsuariosMenus'
]);
}
class GruposUsuariosMenusTable extends Table
{
$this->belongsTo('GruposUsuarios', [
'foreignKey' => 'grupo_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Menus', [
'foreignKey' => 'menu_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Empresas', [
'foreignKey' => 'empresa_id',
'joinType' => 'INNER'
]);
}
class GruposUsuariosController extends AppController
{
public function edit($id = null)
{
...
if ($this->request->is(['patch', 'post', 'put'])) {
// GERA ARRAY DE USUARIOS PARA GRAVAR MULTIPLOS RELACIONAMENTOS
$users_ids = $this->request->data['users'];
foreach ($users_ids as $i=>$value) {
$this->request->data['users'][$i] = array('id'=> $value);
}
// GERA ARRAY DE MENUS PARA GRAVAR MULTIPLOS RELACIONAMENTOS
if (!empty($this->request->data['menus'])) {
$menus_ids = $this->request->data['menus'];
foreach ($menus_ids as $i=>$value) {
$this->request->data['menus'][$i] = [
'id' => $value,
'_joinData' => [
//'grupo_id'=>$id,
//'menu_id'=>$value,
'empresa_id'=>$this->request->data['empresa_id']
]
];
}
} else {
$this->Flash->error(__('Nenhuma permissão selecionada. Favor verificar.'));
$ErrosLocais = array();
array_push($ErrosLocais, array('Permissões'=>'Nenhuma permissão selecionada. Favor verificar.')) ;
}
// VALIDAÇÃO
$grupo = $this->GruposUsuarios->patchEntity($grupo, $this->request->data, [
'associated' => [
'Users' => [
'validate' => false
],
'Menus' => [
'validate' => false
],
'Empresas'
]
]);
if (!$grupo->errors() && !$ErrosLocais) {
// SALVA CLIENTE
if ($this->GruposUsuarios->save($grupo)) {
$this->Flash->success(__('Registro gravado com sucesso.'));
return $this->redirect(['action' => 'index']);
} else {
$this->set('erros', $user->errors());
$this->Flash->error(__('Não foi possivel gravar as informações. Por favor tente mais tarde.'));
}
} else {
$this->set('erros', $grupo->errors());
$this->Flash->error(__('Erros de validação'));
}
}
}