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 rules()
{
return array(
//searchのルールにfilter用の変数を追加する。
array('‥, tbl_user_name', 'safe', 'on'=>'search'),
);
}
public relations()
{
return array(
//リレーションとしてtbl_userテーブルを登録しておく。
'user' => array(self::BELONGS_TO, 'User', 'user_id'),
);
}
public 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',
),
),
)); ?>