yii在CDbCriteria中组合addColumnCondition

时间:2012-12-17 04:55:33

标签: yii

我的GridView中有几个下拉过滤器,在我的模型的搜索部分中:

if ($this->agent_primary != "") {
    $criteria->addColumnCondition(array('agent_type_id'=>1, 'agent.agent_id'=>$this->agent_primary));
}

if ($this->agent_voice != "") {
    $criteria->addColumnCondition(array('agent_type_id'=>2, 'agent.agent_id'=>$this->agent_voice));
}

if ($this->agent_commercial != "") {
    $criteria->addColumnCondition(array('agent_type_id'=>3, 'agent.agent_id'=>$this->agent_commercial));
}

我需要以某种方式结合这个,所以如果有人选择三个下拉列表中的两个(或全部三个),他们得到正确的结果,目前sql在每个addColumnCondition的单独括号中有WHERE:

  

WHERE(condition1a = a AND condition1b = b)AND(condition2a = a AND condition2b = b)

而不是

  

WHERE(condition1a = a AND condition1b = b)OR(condition2a = a AND condition2b = b)

2 个答案:

答案 0 :(得分:2)

您只需使用第三个参数operator of addColumnCondition,将其设为'OR'

if ($this->agent_primary != "") {
    $criteria->addColumnCondition(array('agent_type_id'=>1, 'agent.agent_id'=>$this->agent_primary),'AND','OR');
}

你会得到:

WHERE (agent_type = 1 AND agent.agent_id = X) OR (condition2a = a AND condition2b = b)

答案 1 :(得分:0)

使用addCondition功能 在这里添加您的条件$ criteriaStr; 因为你需要在这里构建你的字符串并在其中使用它。

$criteriaStr = "";
if ($this->agent_primary != "") {
    $criteriaStr .= '(agent_type_id=1 AND agent.agent_id='.$this->agent_primary.')';
}

if ($this->agent_voice != "") {
    if($criteriaStr !== '' ) { $criteriaStr .= ' OR '; }

    $criteriaStr .= '(agent_type_id=2 AND agent.agent_id='.$this->agent_voice.')';
}

if ($this->agent_commercial != "") {
    if($criteriaStr !== '' ) { $criteriaStr .= ' OR '; }

    $criteriaStr .= '(agent_type_id=3 AND agent.agent_id='.$this->agent_commercial.')';
}

$criteria->addCondition($criteriaStr);