在php中为yiiframework创建使用多对多关系的新记录

时间:2013-06-21 15:49:24

标签: php yii

嗨,我对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表中保存这些复选框值?

1 个答案:

答案 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);
   }
}

在保存用户模型后立即从控制器调用此功能(如果确实在保存用户)。请注意,这是未经测试的,但会为您指明方向。