CakePHP-属于数据不会保存到联接表

时间:2018-12-06 13:06:09

标签: cakephp-3.0 model-associations

我涉及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中读了本书,但是我无法使其正常运行,也无法很好地将其包裹住。

有人可以看到或解释我在这里犯的错误吗?


如果您需要更多信息,请告诉我。


1 个答案:

答案 0 :(得分:1)

问题是,整个骨骼都已经烤好了,我没有遵循此特定联接表的命名约定。


来自CakePHP - Conventions

  在模型之间的BelongsToMany关系中使用的

联接表,应以它们将要联接的模型表命名,否则以字母顺序(articles_tags而不是tag_articles)排列的bake命令将不起作用。如果需要在联结表上添加其他列,则应为该表创建一个单独的实体/表类。


因此,我的关系定义错误。我必须删除UsersRoles的MVC,将表从users_roles重命名为roles_users,然后再次烘烤。

还有另一种处理方式,并使用“错误地”命名的表,但是我决定根据约定更改数据库,因为我在应用程序的其他每个部分都遵循了它们。

但是!我将在不久的将来重新配置此方案,并使用自定义的名为join-table的方法来解决此问题。