YiiのGridViewでリレーショナルなテーブルのカラムのfilterを設定したい

CREATE TABLE `tbl_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL COMMENT '担当者名',
  `email` varchar(128) NOT NULL COMMENT 'メールアドレス',
  `password` varchar(128) NOT NULL COMMENT 'パスワード',
  `created` datetime DEFAULT NULL COMMENT '登録日',
  `modified` datetime DEFAULT NULL COMMENT '更新日',
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE  `tbl_point` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT 'ユーザID',
  `point` int(11) NOT NULL DEFAULT '0' COMMENT 'ポイント',
  PRIMARY KEY (`id`),
  KEY `tbl_point` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

のような2つのテーブルがあり、それぞれに該当するモデルやコントローラ、ビューがあるとします。

例えば、tbl_pointのビューのGridViewでtbl_userのほうのデータも表示したい、かつ、filterも設定したい場合は以下のような感じにします。

●tbl_pointのモデルでの変更点

//filter用に変数を用意する。
public $tbl_user_name;

public function rules()
{
  return array(

    //searchのルールにfilter用の変数を追加する。
    array('‥, tbl_user_name', 'safe', 'on'=>'search'),
  );
}

public function relations()
{
  return array(
    //リレーションとしてtbl_userテーブルを登録しておく。
    'user' => array(self::BELONGS_TO, 'User', 'user_id'),
  );
}

public function search()
{
  $criteria=new CDbCriteria;

  $criteria->compare('id',$this->id);
  $criteria->compare('point',$this->point);

  //userモデルも一緒に取得する
  $criteria->with='user';
  $criteria->together=true;

  //tbl_userのnameカラム用のfilterに利用する
  $criteria->compare('user.name',$this->tbl_user_name,true);

  return new CActiveDataProvider($this, array(
    'criteria'=>$criteria,
  ));
}

●tbl_pointのGridViewでの変更点

<?php $this->widget('bootstrap.widgets.TbGridView',array(
  'id'=>'point-grid',
  'dataProvider'=>$model->search(),
  'filter'=>$model,
  'columns'=>array(
    'id',
    'point',
    array(
      //カラム名
      //モデルのattributeLabels()内で設定してもOK
      'header'=>'ユーザ名',
      //filter用に追加した変数
      'name'=>'tbl_user_name',
      //表示されるデータ
      'value'=>'$data->user->name',
    ),
  ),
)); ?>
投稿日:
カテゴリー: php タグ: