2017-04-12 9 views
0

多対多の関係が6つあるモデルがあります。 SearchModelにjoinWithエントリを追加し、検索パラメータが適用されていないindex.phpビューで返される内容を調べると、実際にはベースモデルよりも多くの行が表示されます。さらに調べると、複写行が複数返されていることがわかります。また、ページ区切りをオフにします。たとえば、SearchModelにjoinWithを1つだけ追加し、ページごとに10行にページングを設定した場合、ここでは何が起こるのですか。 175行の基本モデルでは、最初のページに「1-4 of 425 items」と表示されます。 2番目のページには、「425のうち111-16が表示されます。最初のページの最後の項目が2番目のページの先頭に複製されます。ベースモデルには、以下の関係があるYii2 SearchModelを追加する多対多関係で重複した結果が生成される

:いくつかの背景を与えるためにSearchModelで

/** 
    * @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']); 
    } */ 

を、私はこのエントリを持っている:

$query = HerbalPreparations::find()->joinWith('herbalHerbs'); 

があれば、それは違いはありませんので、予めご了承ください私はeager loadingとjoin typeのためのオプションのjoinWithパラメータを追加します。 $ query = HerbalPreparations :: find() - > joinWith( 'herbalHerbs'、true、 'LEFT JOIN');同じ結果が得られます。任意のjoinWithなし

は、index.phpのビューは次のようになります。

enter image description here

:joinWithで

enter image description here

のindex.phpのページ1は次のようになり、前述しました

index.phpビューの2ページ目は次のようになります。

enter image description here

注1ページの最後の行の重複や

言うまでもなく2ページの最初の行は、この問題は、私はjoinWithと追加の多対多の関係を指定した場合は指数関数的に悪くなります。

私は実際にGridViewコントロールフィルタまたは検索フォームを使って検索パラメータを入力した場合、それは完璧に動作します。問題は、index.phpビューが検索パラメータなしで正しく動作する必要があることです。それは、高度なアプリケーションの任意の種類でYii2を使用して誰のための一般的な問題になるよう

これがそうです。私は間違ったことをしているに違いないと確信していますが、私は疲れて何かを見つけることができなくなるまでGoogleを検索しました。 `

+0

検索入力フィールドが空でない場合にのみ、迅速な解決策が ' - > joinWith( 'herbalHerbs');を実装する可能性があります – gmc

+0

これは、joinWithが恐ろしく複雑になり、地球上のすべてのWeb開発者が必要とする日常的な規範的プロセス。確かに、Yii2はこのような全く共通の問題の解決策を実装しています。これを加えると、これは最終製品の ' - > joinWith( 'herbalHerbs'、 'herbalAilments'、 'herbalMedicinalUses'、 'herbalProperties'、 'herbalTags')'であり、確かに。 – LarryTX

答えて

0

私はこの答えのために責任を取ることができません。実際、Yiiフォーラムの初心者がこの答えを出しました。実際にはかなり簡単です。groupBy('id')を追加するだけです。インスタンス

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

のために私は、私はSQLの基本的な知識から、このいずれかを把握することができたはずと仮定しますが、私はこの方法でGROUPBYを使用していたことがありません。

これは、私はそれだけで、簡単な検索でEveryplaceではについて文書化したと思うだろう、このような一般的な必要性のように思えます。残念ながら、それはそうではないようです。

関連する問題