1

嗨,我对 php 很陌生,这里我有两个模型作为用户和角色,它们通过第三个模型作为 users_roles 有很多关系。

以下是我作为 Users.php 的模型

public function relations()
    {       
        return array(
            'userRoles' => array(self::HAS_MANY, 'UserRoles', 'id_users'),
        );
    }

角色.php

public function relations()
    {       
        return array(           
            'userRoles' => array(self::HAS_MANY, 'UserRoles', 'id_roles'),
        );
    }

用户角色.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'); ?>

现在如何将这些复选框值保存在我的 users_roles 表中?

4

1 回答 1

2

首先你的用户和角色的关系有一个错字,当它应该是用户角色时,它们都引用了模型用户角色。

现在回答你的问题。我会在 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);
   }
}

在您保存用户模型后(如果您确实在保存用户),从您的控制器调用此函数。请注意,这是未经测试的,但会给你一个前进的方向。

于 2013-06-22T03:41:24.513 回答