2016-04-27 66 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); 
    } 
}