Yii的CDbCriteria查詢(以及使用$criteria->join出現問題的解決方法)

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章