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', ), ), )); ?>