Yii2 AR查询joinWith使用, left join on
yii2中使用left join时,用query的方法看着更舒服,改起来也方便,如下,其中表别名字段别名等设置起来方便简单
注意AS前面的空格
AR查询时,改的时候真没上面的方便
控制器部分
模型部分
$query = (new \yii\db\Query())
->select('a.id as id,title,create_time,modify_time,username,name')
->from('article AS a')
->leftJoin('user AS u','u.id = a.user_id')
->leftJoin('category AS c','c.id = a.category_id')
->where(['c.id'=>5])
->limit(4)
->orderBy('id DESC')
->All();
如果数据表有前辍的话, 可以使用UserJoke::tableName()获取完整表名,注意AS前面的空格
->from(User::tableName().' AS a')
->leftJoin(User::tableName().' AS j','a.jid = j.id')
AR查询时,改的时候真没上面的方便
控制器部分
$_list = $model::find();
$_list->select(['f.id','f.dateline','n.nid','n.title']);
$_list->from(Favorite::tableName() . ' as f');
$_list->where(['f.userid'=>5]);
$_list->joinWith('newsTitle as n' , false, 'LEFT JOIN'); //注意这里的newsTitle和第2个参数false
$_list->orderBy('f.id DESC')->limit(5)
->asArray()
->all();
其中的newsTitle正是模型中的关联关系方法, 第二个参数flase目的是不再为每个关联执行一条查询语句, 仅一条left join的查询,等同于上面query的方式模型部分
//getNewsTitle与控制器中joinWith的第一个参数对应
//'nid' => 'nid' 前面的nid为News表的nid,后面的nid为Favorite表的nid
public function getNewsTitle() {
return $this->hasOne(News::className(), ['nid' => 'nid']);
}