1

こんにちは、私は php を初めて使用します。ここでは、ユーザーとロールとして 2 つのモデルを使用しています。これらのモデルには、users_roles として 3 番目のモデルを介して関連付ける多くのモデルがあります。

以下は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'),
        );
    }

ユーザーロール.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

最初に、Users と Roles の関係にタイプミスがあります。どちらも、UserRoles であるべきモデルの 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);
   }
}

ユーザーモデルを保存した直後に、コントローラーからこの関数を呼び出します (実際にユーザーを保存している場合)。これはテストされていませんが、方向性を示すことに注意してください。

于 2013-06-22T03:41:24.513 に答える