在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)
| 归档时间: |
|
| 查看次数: |
19882 次 |
| 最近记录: |