Yii2 multiple orFilterWhere


Yii2 multiple orFilterWhere

我正在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);
    }
}