我正在yii2中开发一个动态搜索模块,今天的任务是为列表创建过滤器。例如,下拉列表,您可以在其中选择多个条件。在我们的例子中,它是汽车的状态。因此,您可以选择汽车是处于活动状态还是非活动状态或已售出。但是在某些情况下,用户希望同时搜索两者。如果您仅搜索汽车的状态,过滤器效果很好,它会生成以下 SQL:
SELECT * FROM `gepkocsi` WHERE (((`allapot`='A')) OR ((`allapot`='F'))) AND (`torolt` IS NULL) LIMIT 20
它之所以有效,是因为没有任何进一步的条件,例如车牌。现在让我们看看如果我们将该条件添加到搜索中会发生什么。因此,此时我们搜索牌照包含i字母且状态为"活动"或"已售出"的汽车。将生成以下 SQL:
SELECT * FROM `gepkocsi` WHERE (((`rendszam` LIKE '%i%') OR ((`allapot`='A'))) OR ((`allapot`='E'))) AND (`torolt` IS NULL) LIMIT 20
问题是在车牌(rendszam)之后,shuold是AND而不是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 有什么神奇的东西可以做到这一点?
感谢您的回答!
我找到了如何附加所有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);
}
}