当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 16:51:09 PHP

Yii2框架在使用AR进行多表联合查询时,使用hasmany()会导致分页数据不准确,非常方便进行多表联合查询操作。如果使用AR,在进行多表联合查询时,需要提前对相关模型层的相关数据表模型进行hasOne()或hasMany()操作,即声明关联关系。hasOne()或hasMany()的具体用法和实现原理可以在YII官网的文档中查询。这里我们只讲一下hasOne()和hasMany()使用过程中经常遇到的一个操作。分页查询,使用hasMany()时出现数据问题,查询到的数据不准确。具体代码示例。1:假设有两个表item(商品表)和item_sku(商品sku表),它们的对应关系是1:N,即一个商品可以有多个对应的sku数据,那么在model层声明关联类型item,大致如下:publicfunctiongetSku(){return$this->hasMany(ItemSku::className(),['item_id'=>'id']);}2:我们在controller层写api的时候item的一般分页查询如下:$result=Item::find()->joinwith('sku')->offset(0)->limit(10)->all();3:此时如果我们进行count()计算,假设mysql数据库中的item数据>50条,但往往结果可能只有7条或者5条、8条数据,而不是我们想要的10条数据。在网上查了很多资料,比较靠谱的解释是,因为是一对多的关系,总记录数就是子表(即ItemSku表)的记录数),子表中的数据会出现重复数据,导致数据不准确。解决方法也很简单,就是在查询语句中加入distinct(),即$result=Item::find()->joinwith('sku')->offset(0)->limit(10)->不同的()->所有的();这样,对记录的数据进行去重后,就得到了需要的数据。