[TOC]
# 使用joinWith實現左聯接
用模型進行聯表查詢之前最好先給模型定義好模型關系,假設Article模型的`getUser`這個getter是通過hasOne返回文章的發表用戶模型,則要一次性用join方法查出來是這樣:
~~~php
//SELECT `article`.* FROM `article` LEFT JOIN `user` ON `article`.`user_id` = `user`.`id` WHERE `article`.`id`=1
$article = Article::find()
->where(['article.id' => 1])
->joinWith('user')
->orderBy(['user.id' => SORT_DESC])
->one();
echo $article->title;
echo $article->user->name; //不會產生查詢,因為上面join的時候已經查過了,所以user模型已經生成
~~~
其中要注意where的條件要聲明表名以區分條件字段,否則容易造成同名字段沖突
# 使用innerJoinWith實現內聯接
查詢所有文章以及作者
~~~php
//SELECT * FROM `article` INNER JOIN `user` ON `article`.`user_id` = `user`.`id` WHERE `article`.`id` IN (1,2,3)
$articles = Article::find()->innerJoinWith('user')->where(['in', 'article.id', [1, 2, 3]])->all();
foreach($articles as $article){
echo $article->user->name; //不會產生查詢
}
~~~
# 指定表別名
~~~php
Article::find()->joinWith(['user u'])->orderBy(['u.id' => SORT_DESC])……
~~~
# 多表聯接
~~~php
/*
SELECT * FROM article
LEFT JOIN user on article.user_id = user.id
LEFT JOIN article_type ON article.type_id = article_type.id ……
*/
Article::find()->joinWith(['user', 'articleType'])……
~~~
這樣就會調用Article::getUser和Article::getArticleType兩個方法來獲取關系并構造聯表了
聯表方法本來是可以接收一個字符串作為快速聯單表的,如果要聯多表,就像上面這樣寫成數組,然后一個數組元素就是一個聯表,你要聯多少表就堆多少個元素吧
# join的時候在on條件里追加更多條件
以上例子中都只是單純地拿兩個表的關系字段做on對等比較,如果有自己自定義需求可以用`onCondition`方法:
~~~php
//SELECT `article`.* FROM `article` LEFT JOIN `user` ON (`article`.`user_id` = `user`.`id`) AND (`user`.`status` = 1) WHERE `article`.`id`=1
$article = Article::find()
->where(['article.id' => 1])
->joinWith([
'user' => function($arQuery){
$arQuery->onCondition(['user.status' => 1]); //重點
}
])
->one();
echo $article->title;
echo $article->user->name; //不會產生查詢,因為上面join的時候已經查過了,所以user模型已經生成
~~~
這個條件追加與[AR模型查詢優化](http://www.kkh86.com/it/yii2/guide-db-ar-select.html)里面的**在with時追加其它條件**小節的做法是一樣的,把joinWith或innerJoinWith里的參數換成數組,key是關聯屬性名稱(對應的模型getter),value是一個回調,接收一個AR查詢器,通過這個AR查詢器用onCondition來追加條件
但不能用這樣的鏈式查詢來實現:`joinWith('user')->onCondition($condition)->all()`這是無效的代碼
其中onCondition方法的條件聲明和where是一樣的
- 目錄
- 配置
- 簡介
- 別名
- gii
- 配置項
- 模型
- 簡介
- 增刪改查
- AR和model
- 模型事件
- 場景
- query查詢
- 增刪改
- AR查詢器
- 模型關系定義
- AR模型連表查詢
- fields
- where拼接
- 模塊
- 創建模塊
- 控制器
- 表單
- 跳轉
- 響應
- 驗證器
- Action
- 組件
- url
- 分頁
- 驗證碼
- 緩存
- 文件上傳
- 預啟動組件
- 事件
- 自定義組件
- redis
- 日志
- 行為
- cookie和session
- 基礎知識
- 創建一個類
- 配置一個類
- object基類
- component組件類特性
- phpstorm無法更改php等級
- url地址美化
- 過濾器
- 請求處理
- 請求組件
- 響應組件
- header
- 用戶登錄
- 實現IdentityInterface接口
- 登錄
- 自動檢測登錄
- 獲取用戶信息
- 訪問行為追蹤
- phpstorm+postman斷點調試