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();
这样,因为记录数据去重后,即得到了所需的数据。

你可能感兴趣的:(php,后端)