轉載
先確保 Topic 有 getComments()
方法
class Topic extends \yii\db\ActiveRecord { ... public function getComments() { return $this->hasMany(Comment::className(), ['topic_id' => 'id']); } }
joinWith()
Topic::find()->joinWith('comments'); // 輸出的 SQL SELECT `topic`.* FROM `topic` LEFT JOIN `comment` ON `topic`.`id` = `comment`.`topic_id`
with()
Topic::find()->with('comments'); // 輸出的 SQL SELECT * FROM `topic` SELECT * FROM `comment` WHERE `topic_id` IN (1, 2, 3, 4, 5)
而針對於這兩者,官網上是這樣說的:
yii\db\ActiveQuery::joinWith() 和 yii\db\ActiveQuery::with() 的區別是 前者連接主模型類和關聯模型類的數據表來檢索主模型, 而后者只查詢和檢索主模型類。 檢索主模型
由於這個區別,你可以應用只針對一條 JOIN SQL 語句起效的查詢條件。 如,通過關聯模型的查詢條件過濾主模型,如前例, 可以使用關聯表的列來挑選主模型數據,
用我自己的語言,總結如下:
注意: 我把關聯表,叫做 "副表",
- 當你使用關聯查詢的時候, 你想排除掉副表不滿足的條件下, 主表也給排除掉, 那么我們這時候就選 JoinWith
- 當你不介意對應的副表是否滿足條件時, 只需要把主表顯示出來就行了, 那么我們這時就選with
- 你觀察sql,你會發現, 用with的時候, 沒有with對應的sql語句, 而JoinWith對應的sql語句是存在的, 這點可以注意一下