Yii2的联表查询,本文所讲为在model中的写法,共三种方法
有些话术并不官方,只是为了增加理解速度,意在让阅读的同学快速看懂就好
第一种方法,直接使用sql语句进行查询
在yii2的model中,获取当前model对应的表名,yii2提供两种方法:
$this->tableSchema->name
或
self::tableName()
获取其它model对应的表名,此model文件必须存在:
ModelClass::tableName()
上面的ModelClass,即是当前存在的模型名称
例如有张user表,那对应的模型文件名为User.php,对应的模型名称为User,在其它model中获取此表名称,即:User::tableName()
拿到了表名,再按照常规sql写法,即可写出联表查询方法,再使用yii2提供的查询方法即可拿到结果
$result=self::findBySql($sql)->asarray()->all()
这种方法可以快速写出我们想要实现的语句,不必话费过多时间,去了解yii2提供的联表查询方法
第二种方法,使用yii2框架提供的联表查询方法(其它框架少有的写法):
假设在answer表对应的Answer模型中,关联查询user表的用户信息
首先要保证Answer和User模型文件必须存在,在answer模型中定义需要关联的User方法,此方法为固定写法,换做其它表时,只需替换“user”的字符串即可
public function getUser(){
return $this->hasMany(User::className(),['id'=>'uid'])->from(["user"=>User::tableName()]);
}
然后再写出联表查询方法:
public function getAnswer(){
$result=self::find()->from(["answer"=>self::tableName()])
->joinWith('user')
->orderBy('answer.id desc')
->asarray()
->all();
}
from方法表示对表起别名,demo过于简单,请根据业务自作调整
这种联表查询的方法,有些弊端
1、查询出的结果,以当前表的信息为主,关联表的信息为子数组,被关联表的ModelName为key,两张表的结果并不同级显示;
2、不能指定被关联表的field,每次需要查询全部;
3、若使用“select()”方法指定查询当前表的field,则被关联表只能提供关联服务,并不能返回数据,且使用“asarray()”方法将结果转数组时会报错,只能使用对象方式读取数据;
全部代码如下所示:
第三种方法,yii2框架提供的,最简单实用且方便的联表查询方法:
$list=self::find()->alias('aw')
->where(['aw.paper_id' => '2'])
->leftJoin('as_user u', 'u.id=aw.uid')
->select(['u.*', 'aw.*'])
->asArray()
->all();
上面的代码中,依然是我们例句的answer表和user表,详细理解为:
使用“alias()”方法为当前表起别名
使用“where()”方法添加查询条件
使用“leftJoin()”方法添加左关联,关联条件如方法中第二个参数所示
使用“select()”方法指定查询field,注意此处为array()数组格式
使用“asArray()”方法将查询结果转义数组
使用“all()”方法查询所有符合条件的结果
上一篇:yii2实例化模型
下一篇:Yii2安装使用Redis扩展