无法将用户角色与用户关联

时间:2016-12-06 18:25:49

标签: cakephp associations cakephp-3.0

我有一个数据库中现有用户角色的列表,例如:

+----+-------+-----------+
| id | level |   label   |
+----+-------+-----------+
|  1 |     0 | admin     |
|  2 |     1 | moderator |
|  3 |     2 | blogger   |
+----+-------+-----------+

我想在创建用户时为其添加一个角色。我尝试过的是:

在我的BcUsersController中:

    $bcUser = $this->BcUsers->patchEntity($bcUser, $this->request->data,
        [
            'associated' => [
                'BcUserInfos',
                'BcUserRoles'
            ]
        ]
    );
    if ($this->BcUsers->save($bcUser))...

协会

//BcUserRolesTable
$this->belongsToMany('BcUsers', [
    'className' => 'BcUsers',
    'foreignKey' => 'role',
    'propertyName' => 'BcUserRoles'
]);


//BcUsersTable
$this->hasMany('BcUserRoles', [
    'className' => 'BcUserRoles',
    'foreignKey' => 'id',
    'bindingKey' => 'role',
    'propertyName' => 'BcUserRoles',
    'joinTable' => 'bc_user_roles'
]);

这就是我尝试将userRoleId注入用户表的方式:

<?= $this->Form->input('BcUserRoles.level', ['type' => 'hidden', 'value' => '0']); ?>

<?= $this->Form->input('BcUserRoles.id', ['type' => 'hidden', 'value' => '1']); ?>

当我尝试保存它时,我没有错误只刷新页面并在字段内部发布数据。如果我删除所有关联代码,它将保存user + userInfo。我在这里缺少什么?

修改

我刚在$bcUser变量中发现错误:

'[errors]' => [
        'role' => [
            '_required' => 'This field is required'
        ]
    ],

我认为这就是为什么它不能保存BcUser,而且userRole关联也是空的:

'BcUserRoles' => [],

因此即使我愿意删除

,也不会将userRole保存到用户表 来自BcUsersTable的

->requirePresence('role', 'create'),不是吗?

刚刚测试过。它抛出了SQL错误,因为角色不在查询参数中,而在数据库中它必须在那里,不允许为null。所有用户都应该有一个角色。

2 个答案:

答案 0 :(得分:1)

尝试更新您的belongsTo Relations

$this->belongsTo('BcUsers', [
         'className' => 'BcUsers',
         'foreignKey' => 'role',
         'bindingKey' => 'id',
         'propertyName' => 'BcUserRoles'
     ]);

制作

$this->belongsTo('BcUserRoles', [
         'className' => 'BcUsers',
         'foreignKey' => 'role',
         'bindingKey' => 'id',
     ]);

希望你的问题能够得到解决

答案 1 :(得分:1)

看起来这里有几个问题。

<强>协会

如果BcUsersTable包含BcUserRoles的外键,那么它是belongsTo关系。

  

belongsTo :当前模型包含外键。

http://book.cakephp.org/3.0/en/orm/associations.html#belongsto-associations

同样,这也意味着BcUserRoleshasMany的{​​{1}}关系不是BcUsers关系。

  

hasMany :其他型号包含外键。

http://book.cakephp.org/3.0/en/orm/associations.html#hasmany-associations

发布数据

我假设belongsToBcUserRolesTable的外键是BcUsersTable。这意味着您需要提交role的值,该值是您要关联的用户角色的role

以下内容将创建一个表单元素来执行此操作:

id

其中$this->Form->input('role', ['type' => 'hidden', 'value' => $useRoleId])是您要关联的角色的ID。