ThinkPHP關聯查詢

使用tp框架進行項目開發的時候碰到了需要關聯幾張表查詢的情況,查完thinkPHP3.2.3的開發手冊之後順便將其記錄下來:

1.如果在model中沒有定義關聯模型

$User = D("User");
$user = $User->table("tableA, tableB")->where()->field()->select();


可以通過這樣的語句進行查詢,然後可以通過"$User->getlastSql();"來獲取查詢用的sql語句將會發現這是類似

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表將會得到一個如下所示的結果

  1. array (
  2. 'id' => 1,
  3. 'account' => 'ThinkPHP',
  4. 'password' => '123456',
  5. 'Profile '=> array(
  6. 'email' => '[email protected]',
  7. 'nickname' => '流年',
  8. ),
  9. )

我們可以看到,用戶的關聯數據已經被映射到數據對象的屬性裏面了。其中Profile就是關聯定義的mapping_name屬性。

注:mapping_name關聯的映射名稱,用於獲取數據用 該名稱不要和當前模型的字段有重複,否則會導致關聯數據獲取的衝突。

如果我們按照下面的方式定義了as_fields屬性的話,

  1. protected $_link = array(
  2. 'Profile'=>array(
  3. 'mapping_type' => self::HAS_ONE,
  4. 'class_name' => 'Profile',
  5. 'foreign_key' => 'userId',
  6. 'as_fields' => 'email,nickname',
  7. ),
  8. );

查詢的結果就變成了下面的結果

  1. array(
  2. 'id' => 1,
  3. 'account' => 'ThinkPHP',
  4. 'password' => 'name',
  5. 'email' => '[email protected]',
  6. 'nickname' => '流年',
  7. )

email和nickname兩個字段已經作爲user數據對象的字段來顯示了。

如果關聯數據的字段名和當前數據對象的字段有衝突的話,怎麼解決呢?

我們可以用下面的方式來變化下定義:

  1. 'as_fields' => 'email,nickname:username',



發佈了33 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章