資料庫AR之關聯查詢

程式碼修行者發表於2015-02-10

資料庫AR之關聯查詢

所謂關聯查詢簡單的說就是多表聯合查詢
AR方式的關聯查詢比較DAO有一些複雜
並且也有一些小細節 需要了解

四種關係

  1. 多對一 self::BELONGS_TO
  2. 一對一self::HAS_ONE
  3. 一對多self::HAS_MANY
  4. 多對多self::MANY_MANY

定義

在 model中定義對應關係
user.php

public function relations()
{
    return array(
     //關係名稱            對應關係 關聯的模型(gii建立) 對應的欄位
     'abcd_city'=>array(self::BELONGS_TO,'City','city_id'),
     //欄位的對應規則
     //要關聯的模型中存在 city欄位 著關聯city欄位
     //否則 關聯主鍵
    );
}

使用

懶載入

//到呼叫的時候 才查詢 
//不使用 join
public function actionLazyRead()
{
    $user = User::model()->find();
    //此時 還沒有去資料庫查詢
    //此時採取資料庫去查詢
    //查詢方式通過 user表中中對應的city_id 去city表中查詢
    var_dump($user->abcd_city);
}

渴望載入

//直接 join資料
public function actionEagerRead()
{
    //此時資料已經被查出
    //通過 join的方式查出
    $user = User::model()->with('abcd_city')->find();
    var_dump($user);
}

查詢條件

user.php

public function relations()
{     
    return array(
   //                                            新增別名              'abcd_city'=>array(self::BELONGS_TO,'City','city','alias'=>'c'),
    );
}

當前模型別名預設為t

public function actionEagerRead()
{
    //此時資料已經被查出
    //通過 join的方式查出
    $criteria = new CDbCriteria();
    //當前模型的別名 預設為 t
    $criteria->addCondition('t.id > 5 AND t.id < 10');
    $criteria->order = 't.id desc';
    $criteria->addCondition('c.id < 4');
    $user = User::model()->with('abcd_city')->findAll($criteria);
    var_dump($user);
}

相關文章