[英]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]]);
}
}
}
我認為,如果我將所有字段名稱分別添加為orFilterWhere的參數,則該字段應起作用。 您認為最佳做法是什么? 還是Yii2擁有神奇的魔法呢?
謝謝您的回答!
我找到了如何添加所有OR條件的解決方案。 只是Yii2產生IN積分。
/**
* @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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.