转载
先确保 Topic 有 getComments()
方法
class Topic extends yiidbActiveRecord { ... 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)
而针对于这两者,官网上是这样说的:
yiidbActiveQuery::joinWith() 和 yiidbActiveQuery::with() 的区别是 前者连接主模型类和关联模型类的数据表来检索主模型, 而后者只查询和检索主模型类。 检索主模型
由于这个区别,你可以应用只针对一条 JOIN SQL 语句起效的查询条件。 如,通过关联模型的查询条件过滤主模型,如前例, 可以使用关联表的列来挑选主模型数据,
用我自己的语言,总结如下:
注意: 我把关联表,叫做 "副表",
- 当你使用关联查询的时候, 你想排除掉副表不满足的条件下, 主表也给排除掉, 那么我们这时候就选 JoinWith
- 当你不介意对应的副表是否满足条件时, 只需要把主表显示出来就行了, 那么我们这时就选with
- 你观察sql,你会发现, 用with的时候, 没有with对应的sql语句, 而JoinWith对应的sql语句是存在的, 这点可以注意一下