Yii2 with 和 joinWith 的区别

转载

先确保 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 语句起效的查询条件。 如,通过关联模型的查询条件过滤主模型,如前例, 可以使用关联表的列来挑选主模型数据,

用我自己的语言,总结如下:

注意: 我把关联表,叫做 "副表",

  1. 当你使用关联查询的时候, 你想排除掉副表不满足的条件下, 主表也给排除掉, 那么我们这时候就选 JoinWith
  2. 当你不介意对应的副表是否满足条件时, 只需要把主表显示出来就行了, 那么我们这时就选with
  3. 你观察sql,你会发现, 用with的时候, 没有with对应的sql语句, 而JoinWith对应的sql语句是存在的, 这点可以注意一下

原文地址:https://www.cnblogs.com/jimz/p/9974456.html