joinWith和with的区别

$query = User::find()->select('username,id');
$query->with([
	'message' => function($query){
		$query->where(['!=','title','']);
	}
]);
$res = $query->asArray()->all();

//SQL
'SELECT `username`, `id` FROM `yii_user`'
'SELECT * FROM `yii_message` WHERE `user_id` IN (1,2);

//结果
{
    "code": 200,
    "message": "OK",
    "data": [
        {
            "username": "admin",
            "id": "1",
            "message": [
                {
                    "id": "1",
                    "title": "消息",
                    "content": "呃呃呃",
                    "user_id": "1",
                    "created_at": "1542938501",
                    "updated_at": "1542938501"
                }
            ]
        },
        {
            "username": "zhangsan",
            "id": "2",
            "message": []
        }
    ]
}



$query = User::find()->alias('u')->select('u.username,u.id');
$query->joinWith([
	'message' => function($query){
		$query->alias('m')->where(['!=','m.title','']);
	}
]);
$res = $query->asArray()->all();

//SQL
'SELECT `u`.`username`, `u`.`id` FROM `yii_user` `u` LEFT JOIN `yii_message` `m` ON `u`.`id` = `m`.`user_id` WHERE `m`.`title` != \'\''

//结果
{
    "code": 200,
    "message": "OK",
    "data": [
        {
            "username": "admin",
            "id": "1",
            "message": [
                {
                    "id": "1",
                    "title": "消息",
                    "content": "呃呃呃",
                    "user_id": "1",
                    "created_at": "1542938501",
                    "updated_at": "1542938501"
                }
            ]
        }
    ]
}


//结论
而针对于这两者,官网上是这样说的:
yii\db\ActiveQuery::joinWith() 和 yii\db\ActiveQuery::with() 的区别是 前者连接主模型类和关联模型类的数据表来检索主模型,而后者只查询和检索主模型类来检索主模型。
由于这个区别,你可以应用只针对一条 JOIN SQL 语句起效的查询条件。 如,通过关联模型的查询条件过滤主模型,如前例, 可以使用关联表的列来挑选主模型数据,

用我自己的语言,总结如下:
注意: 我把关联表,叫做 "副表",

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

猜你喜欢

转载自blog.csdn.net/oHeiZhiShi123/article/details/86590043