Yii2添加SearchModel多对多关系产生重复结果

时间:2017-04-12 21:40:45

标签: search join yii2 relationship

我有一个有六对多关系的模型。当我在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视图如下所示:

enter image description here

使用上面描述的joinWith,index.php的第1页如下所示:

enter image description here

index.php视图的第2页看起来像:

enter image description here

请注意第1页上最后一行和第2页第一行的重复。

毋庸置疑,如果我用joinWith指定额外的多对多关系,这个问题会变得更加指数化。

如果我实际使用GridView过滤器或搜索表单输入搜索参数,则效果非常好。问题是index.php视图需要在没有搜索参数的情况下正常工作。

对于在任何类型的高级应用程序中使用Yii2的人来说,这似乎是一个常见问题。我敢肯定我一定做错了什么,但是我搜索谷歌直到我筋疲力尽并且找不到任何帮助。 `

1 个答案:

答案 0 :(得分:0)

我无法对此答案负责。实际上,Yii论坛上的新手给出了这个答案。它实际上相当简单 - 只需添加groupBy('id')即可。例如

$query = HerbalPreparations::find()->joinWith('herbalHerbs', true, 'LEFT JOIN')->groupBy(['id']);

我想我应该能够从SQL的基本知识中弄清楚这一点,但我从来没有以这种方式使用groupBy。

这似乎是一种常见的需求,我认为它会被记录下来并且只是在简单的搜索中发现每个地方。不幸的是,它似乎并不存在。