使用tp框架進行項目開發的時候碰到了需要關聯幾張表查詢的情況,查完thinkPHP3.2.3的開發手冊之後順便將其記錄下來:
1.如果在model中沒有定義關聯模型
$User = D("User");
$user = $User->table("tableA, tableB")->where()->field()->select();
SELECT col1 as c, col2 as b form tableA,tableB where ....
除了使用table來進行關聯查詢外tp框架還提供了JOIN方法
JOIN方法也是連貫操作方法之一,用於根據兩個或多個表中的列之間的關係,從這些表中查詢數據。
根據開發手冊中描述的join通常有下面幾種類型,不同類型的join操作會影響返回的數據結果。
- INNER JOIN: 如果表中有至少一個匹配,則返回行,等同於 JOIN
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
- FULL JOIN: 只要其中一個表中存在匹配,就返回行
2.如果model中已經遵照relationModel定義了關聯關係,關聯關係的詳情請見:
那麼進行關聯查詢非常簡單
這樣查詢$User表將會得到一個如下所示的結果
-
array (
-
'id' => 1,
-
'account' => 'ThinkPHP',
-
'password' => '123456',
-
'Profile '=> array(
-
'email' => '[email protected]',
-
'nickname' => '流年',
-
),
-
)
我們可以看到,用戶的關聯數據已經被映射到數據對象的屬性裏面了。其中Profile就是關聯定義的mapping_name屬性。
注:mapping_name關聯的映射名稱,用於獲取數據用 該名稱不要和當前模型的字段有重複,否則會導致關聯數據獲取的衝突。
如果我們按照下面的方式定義了as_fields屬性的話,
protected $_link = array(
'Profile'=>array(
'mapping_type' => self::HAS_ONE,
'class_name' => 'Profile',
'foreign_key' => 'userId',
'as_fields' => 'email,nickname',
),
);
查詢的結果就變成了下面的結果
array(
'id' => 1,
'account' => 'ThinkPHP',
'password' => 'name',
'email' => '[email protected]',
'nickname' => '流年',
)
email和nickname兩個字段已經作爲user數據對象的字段來顯示了。
如果關聯數據的字段名和當前數據對象的字段有衝突的話,怎麼解決呢?
我們可以用下面的方式來變化下定義:
'as_fields' => 'email,nickname:username',