我涉及3个表: UsersTable , RolesTable , UsersRolesTable
我想在注册时为用户分配一个给定的角色,但是它不会将数据保存到联接表( UsersRolesTable )中,我也不知道为什么。
存在以下关联:
UsersTable
$this->belongsTo('Roles', [
'foreignKey' => 'user_id',
'targetForeignKey' => 'role_id',
'joinTable' => 'users_roles'
]);
RolesTable
$this->belongsToMany('Users', [
'foreignKey' => 'role_id',
'targetForeignKey' => 'user_id',
'joinTable' => 'users_roles'
]);
UsersRolesTable
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Roles', [
'foreignKey' => 'role_id',
'joinType' => 'INNER'
]);
在我的用户控制器中,我具有以下功能
public function register()
{
$roles = TableRegistry::get('Roles');
$role_data = $roles->findByName('User')->first();
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$data = $this->request->getData();
$user->profile = $this->Users->setDefaultProfile();
$user->role = $role_data;
$user = $this->Users->patchEntity($user, $data);
if ($this->Users->save($user)) {
$this->Flash->success(__('Ihr Account wurde erfolgreich angelegt. Sie können sich nun einloggen.'));
return $this->redirect(['action' => 'login']);
}
$this->Flash->error(__('Ihr Account konnte nicht angelegt werden. Bitte versuchen Sie es später erneut.'));
}
$this->set(compact('user'));
}
我从Cakephp中读了本书,但是我无法使其正常运行,也无法很好地将其包裹住。
有人可以看到或解释我在这里犯的错误吗?
如果您需要更多信息,请告诉我。
答案 0 :(得分:1)
问题是,整个骨骼都已经烤好了,我没有遵循此特定联接表的命名约定。
在模型之间的BelongsToMany关系中使用的联接表,应以它们将要联接的模型表命名,否则以字母顺序(articles_tags而不是tag_articles)排列的bake命令将不起作用。如果需要在联结表上添加其他列,则应为该表创建一个单独的实体/表类。
因此,我的关系定义错误。我必须删除UsersRoles的MVC,将表从users_roles
重命名为roles_users
,然后再次烘烤。
还有另一种处理方式,并使用“错误地”命名的表,但是我决定根据约定更改数据库,因为我在应用程序的其他每个部分都遵循了它们。
但是!我将在不久的将来重新配置此方案,并使用自定义的名为join-table的方法来解决此问题。