Yii2 中的 $with 和 $joinWith 有什么区别,何时使用它们?
在 API 文档中,指定
$joinWith
- 此查询应与之连接的关系列表$with
- 应使用此查询的关系列表
这些ActiveQuery属性之间有什么区别,在什么情况下我们应该使用和?$joinWith
$with
在 API 文档中,指定
$joinWith
- 此查询应与之连接的关系列表$with
- 应使用此查询的关系列表
这些ActiveQuery属性之间有什么区别,在什么情况下我们应该使用和?$joinWith
$with
joinWith
用于在原始查询中包含关系,而不包含关系。JOIN
with
为了进一步说明,请考虑具有以下关系的类:Post
comments
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
with
joinWith
使用方法生成以下 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)joins
innerJoins
outerJoins