在網(wǎng)上查過(guò)了很多yii框架多表查詢的問(wèn)題,但總沒(méi)有適合自己的,自己建了幾張表過(guò)來(lái)分析,把操作寫出來(lái)分享Yii框架多表查詢(一對(duì)一與多對(duì)一)和多表?xiàng)l件聯(lián)合查詢給大家:
查一對(duì)一或多對(duì)一(常使用到的就是文章和文章分類關(guān)系)
在yii數(shù)據(jù)庫(kù)模型中比如有一個(gè)Post.php文件
代碼如下:
class Post extends CActiveRecord{
/*
* 返回當(dāng)前模型對(duì)象的靜態(tài)方法
* 重寫父類CActiveRecord對(duì)應(yīng)的方法
*/
public static function model($className = __CLASS__) {
return parent::model($className);
}
/*
* 返回當(dāng)前數(shù)據(jù)表的名字
* 重寫父類CActiveRecord對(duì)應(yīng)的方法
*/
public function tableName() {
return ‘{{post}}’;
}
//關(guān)聯(lián)查詢
public function relations()
{
return array(
//Post與User的關(guān)系是BELONGS_TO(多對(duì)一)關(guān)系,這里的author_id是User中的author_id
//’select’=>’id,username’查出來(lái)的字段
‘author’=>array(self::BELONGS_TO, ‘User’, ‘author_id’,'select’=>’id,username’),
);
}
}
需要弄清楚的幾點(diǎn):
- (1),VarName是指一個(gè)對(duì)像;
- (2),RelationType。一共有4種,分別為self::HAS_MANY, self::BELONGS_TO, self::MANY_MANY, self::HAS_ONE。
- (3),ClassName。即關(guān)聯(lián)的另一個(gè)../model/類名.php。
- (4),F(xiàn)oreignKey。誰(shuí)是誰(shuí)的外鍵?
- (5),附加條件
要是在操作器中使用,那么我們得這么寫:
public function actionIndex(){
$post=post::model();
$criteria = new CDbCriteria();
//加一個(gè)條件就是author_id=2的
//$criteria->condition =”author_id=2″;
//這個(gè)是按什么條件排序
//$criteria->order = ‘t.author_id ASC’;
$criteria->with = array ( ‘author’ );
$result =$post->findAll( $criteria );
print_r($result);
}
以上的例子使用原生態(tài)的sql語(yǔ)句是這樣么寫的:
SELECT * FROM wn_post as p left join wn_user as u ON u.id=p.author_id
多表?xiàng)l件聯(lián)合查詢
根據(jù)網(wǎng)上查到的文章及YII官網(wǎng)介紹,整了好長(zhǎng)時(shí)間。配置好relations。在search函數(shù)中需要如下處理:
// 指明關(guān)聯(lián)表
$criteria->with = array('authorizationProducts');
// 設(shè)置查詢條件
if($this->ap_status != '-1')
{
// together設(shè)置為True時(shí),關(guān)聯(lián)表的數(shù)據(jù)會(huì)一起加載。否則會(huì)報(bào)錯(cuò)。
$criteria->together = TRUE;
$criteria->compare('authorizationProducts.ap_status', $this->ap_status);
}
設(shè)置$criteria->together這步很重要,不然總是會(huì)報(bào)SQL語(yǔ)法錯(cuò)誤。