Yii2 中的 $with 和 $joinWith 有什么区别,何时使用它们?

2022-08-30 13:06:39

在 API 文档中,指定

  • $joinWith- 此查询应与之连接的关系列表
  • $with- 应使用此查询的关系列表

这些ActiveQuery属性之间有什么区别,在什么情况下我们应该使用和?$joinWith$with


答案 1

joinWith用于在原始查询中包含关系,而不包含关系。JOINwith

为了进一步说明,请考虑具有以下关系的类:Postcomments

class Post extends \yii\db\ActiveRecord {
    ...
    public function getComments() {
        return $this->hasMany(Comment::className(), ['post_id' => 'id']);
    }
}

使用以下代码:with

$post = Post::find()->with('comments');

导致以下 sql 查询:

SELECT `post`.* FROM `post`;
SELECT `comment`.* FROM `comment` WHERE post_id IN (...)

而下面的代码:joinWith

$post = Post::find()->joinWith('comments', true)

查询中的结果:

SELECT `post`.* FROM post LEFT JOIN `comment` comments ON post.`id` = comments.`post_id`;
SELECT `comment`.* FROM `comment` WHERE post_id IN (...);

因此,在使用时,您可以按关系排序/筛选/分组。您可能需要自己消除列名的歧义。joinWith

参考资料: http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#lazy-eager-loading


答案 2

和 之间的区别withjoinWith

使用方法生成以下 SQL 查询with

$users = User::find()->with('userGroup');

SELECT * FROM `user`;
SELECT * FROM `userGroup` WHERE userId = ...

...而使用将导致此 SQL 查询joinWith

$users = User::find()->joinWith('userGroup', true)

SELECT * FROM user LEFT JOIN `userGroup` userGroup ON user.`id` = userGroup.`userId`;

因此,当我需要过滤或搜索相关表中的数据时,我正在使用。joinWith

附加信息

文档 -> http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#joining-with-relations 将告诉您:

"使用关系数据库时,一个常见任务是联接多个表,并将各种查询条件和参数应用于 JOIN SQL 语句。您可以重用现有的关系定义并调用 yii\db\ActiveQuery::join() 来实现此目标,而不是显式调用 yii\db\ActiveQuery::joinWith() 来构建 JOIN 查询。"

这意味着,您现在可以自己处理 Yii2 中所有好的相关内容。Yii(不是 Yii2)只使用 join 而不是让用户决定 join 的类型。有关“Join's”的详细信息 - >它是基于SQL的东西。你可以在这里阅读这个 http://en.wikipedia.org/wiki/Join_(SQL)joinsinnerJoinsouterJoins


推荐