Yii框架多表查詢:一對(duì)一和多表?xiàng)l件聯(lián)合查詢

2014-04-11 14:11:50來(lái)源:oschina作者:

在網(wǎng)上查過(guò)了很多yii框架多表查詢的問(wèn)題,但總沒(méi)有適合自己的,自己建了幾張表過(guò)來(lái)分析,把操作寫(xiě)出來(lái)分享Yii框架多表查詢(一對(duì)一與多對(duì)一)和多表?xiàng)l件聯(lián)合查詢給大家:

在網(wǎng)上查過(guò)了很多yii框架多表查詢的問(wèn)題,但總沒(méi)有適合自己的,自己建了幾張表過(guò)來(lái)分析,把操作寫(xiě)出來(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)方法
     * 重寫(xiě)父類CActiveRecord對(duì)應(yīng)的方法
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }
   
    /*
     * 返回當(dāng)前數(shù)據(jù)表的名字
     *  重寫(xiě)父類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),附加條件

要是在操作器中使用,那么我們得這么寫(xiě):

    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ǔ)句是這樣么寫(xiě)的:

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è)置為T(mén)rue時(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ò)誤。

關(guān)鍵詞:Yii框架查詢

贊助商鏈接: