2016-04-27 7 views
0

私はyii2で動的検索モジュールを開発していますが、今日の課題はリストのフィルタを作成することです。たとえば、複数の条件を選択できるドロップダウンリストがあります。私たちの場合、それは車の状態です。したがって、車がアクティブか、非アクティブか、または販売されているかを選択できます。しかし、ユーザーが両方を検索したいというシナリオがあります。ナンバープレートのような任意の更なる条件がないので、それは動作しますYii2 multiple orFilterWhere

SELECT * FROM `gepkocsi` WHERE (((`allapot`='A')) OR ((`allapot`='F'))) AND (`torolt` IS NULL) LIMIT 20 

: お車の状態のみを検索する場合、フィルタがうまく機能し、それは以下のSQLを生成します。ここで、その条件を検索に追加すると、何が起こるかを示します。 この時点で私は、ライセンスプレートにi文字が含まれている車を検索し、そのステータスは「アクティブ」または「Saled」です。次のSQLが生成されます。

SELECT * FROM `gepkocsi` WHERE (((`rendszam` LIKE '%i%') OR ((`allapot`='A'))) OR ((`allapot`='E'))) AND (`torolt` IS NULL) LIMIT 20 

問題は、ナンバープレート(rendszam)shuoldがORのinstedであることです。これは以下の方法で生成されます。そして、これが問題の主な原因につながります。

/** 
* @param $fieldName 
*/ 
public function filterList($fieldName) { 
    if (isset($fieldName) && !empty($this->$fieldName)) { 
     foreach ($this->$fieldName as $singleFieldName) { 
      $this->query->orFilterWhere(['or', 
       [$fieldName => $singleFieldName]]); 
     } 
    } 
} 

orFilterのパラメータとして、すべてのフィールド名を個別に追加するとうまくいくと思います。それを行うベストプラクティスは何だと思いますか?それとも、Yii2はそれをするのに魅力的なことがありますか?

ありがとうございました!

答えて

0

すべてのOR条件を追加する方法を解決しました。単にYii2はIN caluseを生成します。

/** 
* @param $fieldName 
*/ 
public function filterList($fieldName) { 
    if (isset($fieldName) && !empty($this->$fieldName)) { 
     //$this->debug($this->$fieldName); 
     $tomb = []; 
     foreach ($this->$fieldName as $singleFieldName) { 

      $tomb[$fieldName][] = $singleFieldName; 

     } 
     $this->query->andFilterWhere($tomb); 
    } 
}