2016-04-27 67 views
0

我正在使用yii2中的動態搜索模塊,今天的任務是爲列表創建過濾器。例如,下拉列表中您可以選擇多個條件。在我們的情況下,這是一輛汽車的狀態。因此,您可以選擇汽車是處於活動狀態還是非活動狀態或已售出。但是有一種情況是用戶想要同時搜索。 過濾效果很好,如果你搜索汽車的唯一國家,它生成的SQL語句:Yii2 multiple orFilterWhere

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

它的工作原理,因爲沒有像車牌任何其他條件。現在讓我們看看如果我們將該條件添加到搜索中會發生什麼。 因此,目前我們搜索的車輛牌照平臺包含我的信件,並且狀態爲活動或已註冊。生成以下SQL:

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

問題是,牌照(rendszam)shuold後是一個AND的insted或OR。這是由以下方法生成的。這導致我們成爲問題的主要來源。

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