我有一个有六对多关系的模型。当我在SearchModel中添加joinWith条目时,然后,查看index.php视图中返回的内容(未应用搜索参数),它显示的行数比基本模型中的实际行数多。经过进一步检查,我发现正在返回多个重复行。它也抛出了分页的方式。例如,如果我在SearchModel中只添加一个joinWith,并且我将分页设置为每页10行,则会发生这种情况。在具有175行的基本模型中,第一页将显示“1-4个项目中的1-4个”。第二页将显示“425项中的111-16项”。并且第一页的最后一项复制在第二页的顶部。给出一些背景知识:
基本模型具有以下关系:
/**
* @return \yii\db\ActiveQuery
*/
public function getHerbalHerbsHerbalPreparations()
{
return $this->hasMany(\common\models\HerbalHerbsHerbalPreparations::className(),
['herbal_preparation_id' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getHerbalHerbs()
{
return $this->hasMany(\common\models\HerbalHerbs::className(), ['id' => 'herbal_herb_id'])
->viaTable('herbal_herbs_herbal_preparations', ['herbal_preparation_id' => 'id']);
} */
在SearchModel中,我有这个条目:
$query = HerbalPreparations::find()->joinWith('herbalHerbs');
请注意,如果我为预先加载和加入类型添加可选的joinWith参数,则没有任何区别。 `$ query = HerbalPreparations :: find() - > joinWith('herbalHerbs',true,'LEFT JOIN');产生相同的结果。
没有任何joinWith,index.php视图如下所示:
使用上面描述的joinWith,index.php的第1页如下所示:
index.php视图的第2页看起来像:
请注意第1页上最后一行和第2页第一行的重复。
毋庸置疑,如果我用joinWith指定额外的多对多关系,这个问题会变得更加指数化。
如果我实际使用GridView过滤器或搜索表单输入搜索参数,则效果非常好。问题是index.php视图需要在没有搜索参数的情况下正常工作。
对于在任何类型的高级应用程序中使用Yii2的人来说,这似乎是一个常见问题。我敢肯定我一定做错了什么,但是我搜索谷歌直到我筋疲力尽并且找不到任何帮助。 `
答案 0 :(得分:0)
我无法对此答案负责。实际上,Yii论坛上的新手给出了这个答案。它实际上相当简单 - 只需添加groupBy('id')
即可。例如
$query = HerbalPreparations::find()->joinWith('herbalHerbs', true, 'LEFT JOIN')->groupBy(['id']);
我想我应该能够从SQL的基本知识中弄清楚这一点,但我从来没有以这种方式使用groupBy。
这似乎是一种常见的需求,我认为它会被记录下来并且只是在简单的搜索中发现每个地方。不幸的是,它似乎并不存在。