Yii2框架使用AR进行多表联合查询时,使用hasmany()导致分页数据不准

码农天地 -
Yii2框架使用AR进行多表联合查询时,使用hasmany()导致分页数据不准

使用Yii2框架进行开发时,经常会遇到多表联合查询的场景,利用Yii自带的AR类,可以很方便的进行多表联合查询操作。
如果使用的是AR的话,在进行多表联合查询时,需要提前在相关的model层对相关的数据表模型进行hasOne()或hasMany()操作,即声明关联关系。
hasOne()或hasMany()的具体使用方法和实现原理,可以在YII的官方网站的文档中进行查询,这里只说一下hasOne()和hasMany()在使用过程中经常会遇到的一个操作,分页查询,以及使用hasMany()时产生的一个数据问题,所查询的数据不准确。具体用代码举例说明。

1:假设有两张表item(商品表),item_sku(商品sku表),它们的对应关系是 1:N,即一个商品可以有多个对应的sku数据,那么在item的model层声明关联类型时,大概如下:
public function getSku()
{
return $this->hasMany(ItemSku::className(), ['item_id' => 'id']);
}

2:我们在item的controller层进行api编写时,一般分页查询如下:
$result = Item::find()->joinwith('sku')->offset(0)->limit(10)->all();

3:此时如果我们对$result进行 count()计算,假设mysql数据库中的item数据>50条,但往往得出的结果可能只是7或者5,8之类的数据,而不是我们想要的10条数据。

网上查了很多资料,比较靠谱的解释是,因为是1对多的关系,记录总数是子表的记录数(即ItemSku表),而子表的数据会有重复数据,进而导致数据不准。解决的方法也很简单,即在查询语句中加上distinct(),即
$result = Item::find()->joinwith('sku')->offset(0)->limit(10)->distinct()->all();
这样,因为记录数据去重后,即得到了所需的数据。

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

php介绍

PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。

Tags 标签

php后端

扩展阅读

加个好友,技术交流

1628738909466805.jpg