联系QQ 284710375
首页 > 技术分享 > Yii
收藏

Yii2联表查询2021-11-29 13:51:01

大潇博客 原创文章,转载请标明出处

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()”方法将结果转数组时会报错,只能使用对象方式读取数据;


全部代码如下所示:

image.png


第三种方法,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()”方法查询所有符合条件的结果


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311