Yii FrameworkのCDbCriteriaを毎日毎日書いてるわけですが、
$criteria=new CDbCriteria();
としたあと、書き方の選択肢がいくつかあるので、そのメモです。
■ 他のtableをjoinする場合
$criteria->join.=' LEFT JOIN {{table_a}} a ON t.table_a_id=a.id ';
※メインのtableは t というデフォルトの別名が付きます。
※複数のtableをjoinする場合、CDbCriteriaのjoinプロパティは一つしか無い(配列ではなく文字列なので)ので.(ドット)で連結する事に注意!
※{{table_name}}で指定する事で、動的にprefixを無視してtable名を読み込めます。便利ですね
■ paramsの持たせ方
配列なので当たり前だけど後からどんどん追加できます。
$criteria->params[':name']="%{$name}%"; // 文字列
$criteria->params[':test_1']=$test_1; // 数値等
■ 一つのtextFieldで複数のfieldをテキスト検索する場合
$criteria->addCondition('t.title LIKE :title OR t.comment LIKE :comment');
$criteria->params[':title']="%{$search['text']}%";
$criteria->params[':comment']="%{$search['text']}%";
■ where in で検索する方法
普通にリファレンスに書いてありますけどね、、一応メモ
$criteria->addInCondition('group_id', $group_id_array);
■ createCommandでも書けます
$commands=Yii::app()->db->createCommand()
->from('{{member}} t')
->leftJoin(
'{{member_category_relation}} c',
't.id=c.member_id AND c.group_id=:group_id'
,
array(
':group_id'=>$this->_group->id,
)
)
->select(array(
't.id AS id',
'name',
'category_id',
't.update_time AS update_time'))
->where(
array('in', 't.id', $member_ids)
);
// 後から追加も可能
$commands->order=$order_sql;
// コマンド実行
$datas=$commands->queryAll();