Yii的CDbCriteria查詢(以及使用$criteria->join出現問題的解決方法)
$criteria = new CDbCriteria;
//select
$criteria->select = '*'; //默認*
$criteria->select = 'id,name'; //指定的字段
$criteria->select = 't.*,t.id,t.name'; //連接查詢時,第一個表as t,所以用t.*
$criteria->distinct = FALSE; //是否唯一查詢
//where 查詢數字字段$criteria->addCondition("id=1"); //查詢條件,即where id = 1
$criteria->addBetweenCondition('id', 1, 4); //between 1 and 4
$criteria->addInCondition('id', array(1,2,3,4,5)); //代表where id IN (1,23,,4,5,);
$criteria->addNotInCondition('id', array(1,2,3,4,5)); //與上面正好相法,是NOT IN
//where 查詢字符串字段$criteria->addSearchCondition('name', '分類'); //搜索條件,其實代表了。。where name like '%分類%'
//where 查詢日期字段$criteria->addCondition("create_time>'2012-11-29 00:00:00'");
$criteria->addCondition("create_time<'2012-11-30 00:00:00'");
//where and or$criteria->addCondition('id=1','OR'); //這是OR條件,多個條件的時候,該條件是OR而非AND
//這個方法比較特殊,他會根據你的參數自動處理成addCondition或者addInCondition,//即如果第二個參數是數組就會調用addInCondition
$criteria->compare('id', 1);
$criteria->addCondition("id = :id");
$criteria->params[':id']=1;
//order $criteria->order = 'xxx DESC,XXX ASC' ; //排序條件
//group$criteria->group = 'group 條件';
$criteria->having = 'having 條件 ';
//limit$criteria->limit = 10; //取1條數據,如果小於0,則不作處理
$criteria->offset = 1; //兩條合併起來,則表示 limit 10 offset 1,或者代表了。limit 1,10
//join$criteria->join = 'left join table2 t2 on(t.id=t2.tid)'; //連接表
$criteria->with = 'xxx'; //調用relations(relation在模型中設置)
對於$criteria->join關聯查詢的條件設置以及調用relations的方法:
e.g. 通過關聯查詢獲取user表和activity表的用戶名和活動名
main_info 表部分字段:id, user_id, aid
user_info 表部分字段:id, user_name
activity_info 表部分字段: id, act_name
(1)設置relations:
在main_info表生成的model模型MainInfo.php裏的relations函數裏設置:
public function relations()
{
<span style="color:#c0c0c0;">// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.</span>
return array(
'user'=>array(self::BELONGS_TO, 'UserInfo', 'id', 'foreignKey'=>'user_id', 'select'=>'id,user_name'),
'activityinfo'=>array(self::BELONGS_TO, 'ActivityInfo', 'id', 'foreignKey'=>'aid', 'alias'=>'activityinfo', 'select'=>'id,act_name'),
);
}
HAS_MANY,HAS_ONE 第三個參數使用關聯表對應當前表主鍵的字段BELONGS_TO 第三個參數使用當前表對應關聯表主鍵的字段
MANY_MANY 目前還未使用到(多對多關係中第三個參數爲,中間表名( 本表外鍵, many表外鍵 ))
foreignKey 關聯的外鍵
alias 別名
(2)在控制器中進行查詢
$criteria->join = 'join user_info user on t.user_id=user.id join activity_info activity on t.aid=activity.id';
$criteria->with = 'activityinfo';
(3)在視圖中顯示數據
<td><?php echo $row->activityinfo->act_name; ?></td>
<td><?php echo $row->user->user_name; ?></td>
*注意的問題
(1)不需要再在控制器上寫$criteria->select篩選條件
$criteria->select = 'user.user_name, activity.act_name, t.*';
否則會出現500錯誤:Active record "MainInfo" 正嘗試選擇一個無效的欄位 "user.user_name". 注意, 該欄位必須存在於 table 中或者是一個具別名的 expression.(2)定義表名的時候不能重複命名
$criteria->join = 'join user_info user on t.user_id=user.id join activity_info activityinfo on t.aid=activityinfo.id';
上面的activity_info表命名activityinfo和模型中的別稱activityinfo相同,會導致報錯:1066 Not unique table/alias,解決方法就是重新命名控制器中的activityinfo