【问题标题】:CakePHP - belongsTo Data doesn't get saved to Join-TableCakePHP - belongsTo 数据没有保存到 Join-Table
【发布时间】:2018-12-06 13:06:09
【问题描述】:

我涉及 3 个表:UsersTableRolesTableUsersRolesTable

我想在注册时为用户分配给定的角色,但它没有将数据保存到连接表(UsersRolesTable),我不知道为什么。

存在以下关联:


用户表

$this->belongsTo('Roles', [
  'foreignKey' => 'user_id',
  'targetForeignKey' => 'role_id',
  'joinTable' => 'users_roles'
]);

角色表

$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 的书中读到了,但我无法让它工作,也无法很好地理解它。

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


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


【问题讨论】:

  • 您是否确认$role_data 被正确读取,并且不只是空值?在您尝试保存之前,您的 $user 实体是什么样的?
  • @GregSchmidt 我设法做对了。这是数据库中的错误,因为我烘焙了代码,Join-Table 的表名必须是“roles_users”,否则 Cake 无法获得正确的关系(我想知道为什么......)。是不是很高兴发现。这意味着我必须删除 UsersRoles 的所有 MVC,因为它们定义了错误的关系。我也不得不$roles->findByName('User')->toArray(); 而不是->toList();

标签: cakephp-3.0 model-associations


【解决方案1】:

问题是,整个骨架都烤好了,我没有遵循这个特定连接表的命名约定。


来自CakePHP - Conventions

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


因此,我的关系定义错误。我不得不删除 UsersRoles 的 MVC,将我的表从 users_roles 重命名为 roles_users 并再次烘焙。

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

但是!我将在不久的将来重新配置这个场景,并使用自定义命名的连接表来解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多