Yii的關聯查詢

在項目過程當中許多地方須要用到關聯查詢的,join左鏈接 (left join),又稱內鏈接 (inner join),要兩個表格內都有一樣的值,那一條記錄纔會被選出,說白了是要表裏面有重複的字段。sql

這種狀況下把兩個表關聯起來查詢出咱們須要的內容。在項目中每一個model寫有基於model的service文件,基本封裝了增刪改查統計等經常使用操做。可是沒有涉及到關聯查詢的。也不想每次都寫sql語句來執行。會看起來很亂。查了不少網上的資料關於Yii框架的數據庫操做。數據庫

基礎內容以下:數組

(我用的是Yii1.1.4,仍是Yii1.1的方法 注:HAS_MANY HAS_ONE是yii1.1.7版本才更新的)框架

雖然框架註釋和文檔有中文翻譯,不過看了感受仍是不明不白的,再經過翻譯和本身的理解總結一下。yii

 
 
CDbCriteria類中定義的變量:

const
PARAM_PREFIX=':ycp'; //參數前綴 public static $paramCount=0; //匿名參數生成名稱的計數器 public $select='*'; //select 列名用逗號分隔或數組形式 默認查全部 public $distinct=false; //true取惟一值 默認false public $condition=''; //至關於where條件 public $params=array(); //用佔位符當索引的參數數組 public $limit=-1; //返回記錄條數,默認-1無限制 public $offset=-1; //偏移量,默認從0開始 public $order=''; //排序,至關於order by public $group=''; //分組,至關於group by public $join=''; //LEFT JOIN users ON users.id=authorID public $having=''; //添加group by的條件 public $with; //關係查詢條件 用於AR方法傳遞參數 public $alias; //表別名 不設置默認爲‘t’ public $together; //boolean型,用於AR中HAS_MANY和MANY_MANY關係中。設置爲true只執行單個sql,設置爲false時 執行HAS_MANY public $index; //結果集屬性索引,默認null從0開始 public $scopes; //應用範圍,用法好複雜

查詢合集——AR中的方法:post

1.findAll該方法是根據一個條件查詢一個集合  condition是查詢條件,params是sql查詢參數
public function findAll($condition='',$params=array())  
$admin=Admin::model()->findAll($condition,$params); 
$admin=Admin::model()->findAll("username=:name",array(":name"=>$username)); 
$admin=Admin::model()->findAll(「username=:name and age=:age」 , array(「:name」=>$name, 「age」=>$age)); 
$admin=Admin::model()->findAll(「username like :name and age=:age」 , array(「:name」=>$name, 「age」=>$age)); 
$infoArr= NewsList::model()->findAll("status = '1' ORDER BY id DESC limit 10 ");

2.findAllByPk(該方法是根據主鍵查詢一個集合,可使用多個主鍵)
public function findAllByPk($pk,$condition='',$params=array())
$admin=Admin::model()->findAllByPk($postIDs,$condition,$params); 
$admin=Admin::model()->findAllByPk($id,"name like :name and age=:age",array(':name'=>$name,'age'=>$age)); 
$admin=Admin::model()->findAllByPk(array(1,2));

3.findAllByAttributes (該方法是根據條件查詢一個集合,能夠是多個條件,把條件放到數組裏面)
public function findAllByAttributes($attributes,$condition='',$params=array())
$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params); 
$admin=Admin::model()->findAllByAttributes(array('username'=>'admin'));

4.findAllBySql (該方法是根據SQL語句查詢一個數組)
public function findAllBySql($sql,$params=array())
$admin=Admin::model()->findAllBySql($sql,$params); 
$admin=Admin::model()->findAllBySql("select * from admin where username like :name",array(':name'=>''));

5.根據主鍵查詢出一個對象,如:findByPk(1);
public function findByPk($pk,$condition='',$params=array())
$admin=Admin::model()->findByPk($postID,$condition,$params); 
$admin=Admin::model()->findByPk(1);

6.根據一個條件查詢出一組數據,多是多個,可是他只返回第一行數據
public function find($condition='',$params=array())
$row=Admin::model()->find($condition,$params); 
$row=Admin::model()->find('username=:name',array(':name'=>'admin'));

7.根據條件查詢一組數據,能夠是多個條件,把條件放到數組裏面,查詢的也是第一條數據
public function findByAttributes($attributes,$condition='',$params=array())
$admin=Admin::model()->findByAttributes($attributes,$condition,$params); 
$admin=Admin::model()->findByAttributes(array('username'=>'admin'));

8.根據SQL語句查詢一組數據,他查詢的也是第一條數據
public function findBySql($sql,$params=array())
$admin=Admin::model()->findBySql($sql,$params); 
$admin=Admin::model()->findBySql("select * from admin where username=:name",array(':name'=>'admin'));

9.根據一個條件查詢一個集合有多少條記錄,返回一個int型數字
public function count($condition='',$params=array())
$n=Post::model()->count($condition,$params); 
$n=Post::model()->count("username=:name",array(":name"=>$username));

10.根據SQL語句查詢一個集合有多少條記錄,返回一個int型數字
public function countBySql($sql,$params=array())
$n=Post::model()->countBySql($sql,$params); 
$n=Post::model()->countBySql("select * from admin where username=:name",array(':name'=>'admin'));

11.根據一個條件查詢查詢獲得的數組有沒有數據,若是有數據返回一個true,不然沒有找到
public function exists($condition='',$params=array())
$exists=Post::model()->exists($condition,$params); 
$exists=Post::model()->exists("name=:name",array(":name"=>$username));

查詢合集——CDbCriteria中的方法:spa

1.拼一個得到SQL的方法,在根據find查詢出一個對象
$criteria=new CDbCriteria; 
$criteria->select='username'; 
$criteria->condition='username=:username'; //請注意,這是一個查詢的條件,且只有一個查詢條件.多條件用addCondition 
$criteria->params=array(":username=>'admin'"); 
$criteria->order ="id DESC"; 
$criteria->limit ="3"; 
$post=Post::model()->find($criteria);

2.多條件查詢的語句new CDbCriteria
$criteria=new CDbCriteria;
public function addCondition($condition,$operator='AND') $criteria->addCondition("id=1"); //查詢條件,即where id = 1 $criteria->addCondition('id=1','OR'); //這是OR條件,多個條件的時候,該條件是OR而非AND public function addInCondition($column,$values,$operator='AND') $criteria->addInCondition('id',array(1,2,3,4,5)); //表明where id IN (1,2,3,4,5,); public function addNotInCondition($column,$values,$operator='AND') $criteria->addNotInCondition('id',array(1,2,3,4,5)); //與上面正好相法,是NOT IN public function addSearchCondition($column,$keyword,$escape=true,$operator='AND',$like='LIKE') $criteria->addSearchCondition('name','分類'); //搜索條件,其實表明了where name like '%分類%' public function addBetweenCondition($column,$valueStart,$valueEnd,$operator='AND') $criteria->addBetweenCondition('id', 1, 4);//between 1 and 4 public function compare($column, $value, $partialMatch=false, $operator='AND', $escape=true) $criteria->compare('id', 1); //這個方法比較特殊,他會根據你的參數自動處理成addCondition或者addInCondition. $criteria->compare('id',array(1,2,3)); //即若是第二個參數是數組就會調用addInCondition $criteria->select ='id,parentid,name'; //表明了要查詢的字段,默認select='*'; $criteria->join ='xxx'; //鏈接表 $criteria->with ='xxx'; //調用relations $criteria->limit = 10; //取10條數據,若是小於0,則不做處理 $criteria->offset = 1; //兩條合併起來,則表示 limit 10 offset 1,或者表明了。limit 1,10 $criteria->order ='xxx DESC,XXX ASC';//排序條件 $criteria->group ='group 條件'; $criteria->having ='having 條件 '; $criteria->distinct = FALSE;//是否惟一查詢 $re = Admin::model()->findAll($criteria); 注意當調用addCondition方法時是給查詢追加條件,默認用AND鏈接條件,參數condition條件也但是數組,數組中全部元素即爲追加條件,經過操做符鏈接。

下面就是說使用join的時候 鏈接表,而後用with調用relations方法翻譯

$criteria->join = 'left join table2 t2 on(t.id=t2.tid)'; //鏈接表
$criteria->with = 'xxx'; //調用relationscode

什麼是relations?對象

在繼承了AR的model類中有一個relations方法,剛開始是空的,咱們要創建關聯關係就須要在這個方法中寫入,目的是爲了

在執行關聯查詢以前,須要讓AR知道一個AR類是怎麼關聯到另外一個的,Model類之間要創建聯繫,兩個類之間的關聯關係等同於相對應的數據表之間的關係,兩個表之間的關係有一對1、一對多,多對多三種。對應於AR類之間也是這樣的關係:

const BELONGS_TO='CBelongsToRelation';
const HAS_ONE='CHasOneRelation'; const HAS_MANY='CHasManyRelation'; const MANY_MANY='CManyManyRelation'; const STAT='CStatRelation';  
AR裏定義了這些常量

一、一對一(one-to-one)

  HAS_ONE(有一個): 這是 HAS_MANY 的一個特例,A 最多有一個 B (例如 User 最多有一個 Profile);

二、一對多(one-to-many)

  BELONGS_TO(屬於): 若是表 A 和 B 之間的關係是一對多,則 表 B 屬於 表 A (例如 Post 屬於 User);

  HAS_MANY(有多個): 若是表 A 和 B 之間的關係是一對多,則 A 有多個 B (例如 User 有多個 Post);

三、多對多(many-to-many)

  MANY_MANY: 這個對應於數據庫中的 多對多 關係。

  因爲多數 DBMS 不直接支持 多對多 關係,所以須要有一個關聯表(一張表包含另外兩張表的主鍵id)將 多對多 關係分割爲 一對多 關係。

 在model中覆蓋CActiveRecord中的relations()方法。

public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
        );
    }
此方法返回一個關係配置數組,寫在return array()中
'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options) 

VarName 是關係的名字;
RelationType 指定關係類型,能夠是四個常量之一: self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY and self::MANY_MANY;
ClassName 是此 AR 類所關聯的 AR 類的名字;
ForeignKey 指定關係中使用的外鍵(一個或多個)。'foreignKey'=>'';
additional options 能夠是別名 'alias'=>'';

多對多關係中
好比說品牌Brand和分類Category
在BrandModel中
‘Categorys’=>array(self::Many_Many,'CategoryModel','brand_category(brand_id,category_id)),
在CategoryModel中
‘brands’=>array(self::Many_Many,'BrandModel','brand_category(category_id,brand_id)),

(只須要設置一方便可)

這樣就能夠在Brand的Views裏面經過Categorys來訪問CategoryModel的屬性值
STAT靜態查詢 僅用於HAS_MANY和MANY_MANY
相關文章
相關標籤/搜索