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

NAT*_*863 31 php yii yii2

在API文档中指定了它

  • $joinWith-关系的列表,此查询应加入
  • $with-这个查询应的关系的列表进行

是什么这些ActiveQuery财产之间和下我们应该使用什么情况差异$joinWith$with

top*_*her 36

joinWith用于JOIN在原始查询中包含关系,with而不包括.

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

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

使用with以下代码:

$post = Post::find()->with('comments');
Run Code Online (Sandbox Code Playgroud)

导致以下sql查询:

SELECT `post`.* FROM `post`;
SELECT `comment`.* FROM `comment` WHERE post_id IN (...)
Run Code Online (Sandbox Code Playgroud)

joinWith代码如下:

$post = Post::find()->joinWith('comments', true)
Run Code Online (Sandbox Code Playgroud)

结果在查询中:

SELECT `post`.* FROM post LEFT JOIN `comment` comments ON post.`id` = comments.`post_id`;
SELECT `comment`.* FROM `comment` WHERE post_id IN (...);
Run Code Online (Sandbox Code Playgroud)

因此,在使用时,joinWith您可以通过/ filter/group按关系排序.您可能必须自己消除列名称的歧义.

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


lin*_*lin 25

with和之间的区别joinWith

使用with方法会产生以下SQL查询

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

SELECT * FROM `user`;
SELECT * FROM `userGroup` WHERE userId = ...
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * FROM user LEFT JOIN `userGroup` userGroup ON user.`id` = userGroup.`userId`;
Run Code Online (Sandbox Code Playgroud)

所以joinWith我在需要过滤或搜索相关表格中的数据时使用.

其他信息

实况 - > http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#joining-with-relations会告诉你:

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

这意味着,你能够处理joins,innerJoins,outerJoins自己现在所有的好相关的Yii2东西.Yii(不是Yii2)仅使用join而不让用户决定连接类型.关于"Join"的详细信息 - >它是一个基于SQL的东西.你可以在这里阅读http://en.wikipedia.org/wiki/Join_(SQL)