嗨,我对php很新 在这里,我有两个模型作为用户和角色,他们通过第三个模型有很多关系 users_roles。
以下是我的模特 Users.php
public function relations()
{
return array(
'userRoles' => array(self::HAS_MANY, 'UserRoles', 'id_users'),
);
}
Roles.php
public function relations()
{
return array(
'userRoles' => array(self::HAS_MANY, 'UserRoles', 'id_roles'),
);
}
UsersRoles.php
public function relations()
{
return array(
'idUsers' => array(self::BELONGS_TO, 'Users', 'id_users'),
'idRoles' => array(self::BELONGS_TO, 'Roles', 'id_roles'),
);
}
现在,当我创建用户时,我使用复选框添加了角色
<?php echo $form->labelEx($model,'roles'); ?>
<?php
//print_r($userRoles);
//die;
echo CHtml::activeCheckboxList(
$userRoles, 'id_roles',
CHtml::listData(Roles::model()->findAll(), 'id', 'name'),
array('template'=>'{input} {label}',)
);
?>
<?php echo $form->error($model,'roles'); ?>
现在如何在user_roles表中保存这些复选框值?
答案 0 :(得分:2)
首先你的用户和角色的关系有一个拼写错误,当它们应该是UsersRoles时它们都引用模型UserRoles。
现在回答你的问题。我会在UsersRoles模型中创建一个名为refreshRoles($ user,$ roles)的函数。其中$ user是您为其选择角色的用户ID,$ roles是应该设置的角色数组。该函数将通过id_users检索角色列表,并将其与$ roles进行比较,删除$ roles中缺少的角色,以及添加UsersRoles表中缺少的角色。
这看起来像这样:
function refreshRoles($user, $roles) {
$userRoles = $this->findAllByAttribute(array('id_users' => $user));
foreach ($userRoles as $userRole) {
if (!in_array($userRole->id_roles, $roles)) {
$userRole->delete();
}
else {
$key = array_search($userRole->id_roles, $roles));
unset($roles[$key]);
}
foreach ($roles as $role) {
$model = new UsersRoles();
$model->id_users = $user;
$model->id_roles = $role;
$model->save(false);
}
}
在保存用户模型后立即从控制器调用此功能(如果确实在保存用户)。请注意,这是未经测试的,但会为您指明方向。