版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
通過在 relations() 中聲明這些相關對象,我們就可以利用強大的 Relational ActiveRecord (RAR) 功能來訪問資訊的相關對象,例如它的作者和評論。不需要自己寫複雜的 SQL JOIN 語句。
- 前提條件
在組織數據庫時,需要使用主鍵與外鍵約束才能使用ActiveReocrd的關係操作;
- 場景
申明關係
兩張表之間的關係無非三種:一對多;一對一;多對多; 在AR中,定義了四種關係:
關係 | 定義 | 例子 |
---|---|---|
BELONGS_TO | A和B的關係是一對多,那麼B屬於A | Post屬於User |
HAS_MANY | A和B之間的關係是一對多,那麼A有多個B | User有多個Post |
HAS_ONE | 這是HAS_MANY的一種特殊情況,A至多有一個B | User至多有一個Profile |
MANY_MANY | 這個對應多對多的情況,在AR裏會將多對多以BELONGS_TO和HAS_MANY的組合來解釋 | Post和Category |
在AR中通過重寫CActiveRecord類的relations()方法來申明關係;這個方法返回一個關係配置的數組;一個數組無素代表一個單獨的關係,格式如下:
'VarName'=>array('RelationType','ClassName','ForeignKey', ...additional options)
Var Name | 關係名 |
---|---|
Relation Type | 四種關係:self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY, self::MANY_MANY |
Class Name | 代表當前AR類要關聯的那個AR類名 |
Foreign Key | 實現關係的外鍵, 有可能有多個,即列名 |
- 'select': string|array, 被選中的列列表。默認值爲 '*',這意味着是所有列。 如果它們出現在一個表達式中(例如: COUNT(relationName.name) AS name_count)。
- 'condition': string, WHERE子句。 默認值爲空。 注意,列引用需要加入'relationName'前綴 。(例如:relationName.age>20)
- 'order': string, ORDER BY子句。 默認值爲空。 注意,列引用需要加入'relationName'前綴 。(例如:relationName.age DESC)
- 'with': string|array, 應該與這個對象一起裝載的子對象相關名單。 注意,這僅僅是延遲加載,而不是預先加載。
- 'joinType': 聯接類型。 默認值爲‘LEFT OUTER JOIN’。
- 'alias': 關係與關聯表的別名。 它默認爲null, 意味着表的別名與關係名稱相同。
- 'params': 參數綁定到要生成的SQL語句上。 這應作爲名稱-值的數組。
- 'on': ON 子句。 此處指定的條件將追加到使用 AND 運算符的聯接條件。
- 'index': 其值應作爲存儲相關的對象的數組的鍵的列的名稱。 此選項僅適用於, HAS_MANY 和 MANY_MANY 關係。
- 'scopes': 應用範圍。在單一的範圍情況下可以像'scopes'=>'scopeName', 在多個作用域範圍情況下可以使用數組像這樣'scopes'=>array('scopeName1','scopeName2')。 此選項自版本 1.1.9 可用。
延遲加載時有一定的關係,下列選項可用:
- 'group': string, GROUP BY子句。 默認值爲空。 注意,列引用需要加入'relationName'前綴 。(例如: relationName.age)。此選項僅適用於HAS_MANY 和 MANY_MANY 關係。
- 'having': string, HAVING子句。 默認值爲空。 注意,列引用需要加入'relationName'前綴 。(例如: relationName.age)。此選項僅適用於HAS_MANY 和 MANY_MANY 關係。
- 'limit': 數據行的limit選擇。 這個選項不能應用到BELONGS_TO。
- 'offset': 數據行的偏移量。 這個選項不能應用到BELONGS_TO。
- 'through': 獲取相關的數據時將用作橋的模型的關係的名稱。可以設置僅爲 HAS_ONE 和 HAS_MANY。此選項自版本 1.1.7 可用。