Yii CDbCriteria - OR和foreach()

时间:2012-06-02 03:16:01

标签: php activerecord yii

我有一些元素数组

$cities = array('Paris', 'London', 'Berlin', 'Vinnitsa');

我需要在某些情况下合并标准。我使用这样的范围:

    public function city($cities){
        foreach ($cities as $city){
            $this->getDbCriteria()->mergeWith(array(
                'condition'=>'city LIKE :num',
                'params'=>array(':num'=>$city),
            ), false);
        }
        return $this;
    }

我需要生成这样的东西:

... WHERE ext_id='34' 
      AND (ctiy LIKE 'Paris' OR city LIKE 'London' OR city LIKE 'Berlin' OR city LIKE 'Vinnitsa') 
      AND (....)

但不是Yii-AR产生的:

WHERE (
     (some_id= 34) 
    OR 
     (city LIKE 'Paris')
   ) 
  OR (city LIKE ''London'')

如何使用getDbCriteria()->mergeWith()在一个括号中创建单个OR条件? 关于定制的条件,我知道,但是很麻烦;)


UPD:2012-06-03:

我已经解决了这个问题:

$citiesReg = implode('|',$cities); //Convert to REGEXP 

$this->getDbCriteria()->mergeWith(array(
       'condition'=>'city REGEXP :city',
       'params'=>array(':city'=>$citiesReg),
        ));
return $this;

对于使用UTF-8,您还需要:  1.小写数组的每个元素mb_strtolower($ val,' UTF-8');在转换为字符串之前。  2.稍微修改条件:'条件' =>' LOWER(城市)REGEXP:city'

这是因为MySQL lib REGEXP与utf-8有很大关系。

感谢您的参与!

2 个答案:

答案 0 :(得分:1)

试试addInCondition,第一个参数是条件(例如'引用LIKE \'伦敦\''),第二个参数是运算符(OR或AND)。

您可以预先处理数组(城市)并使用addInCondition。

答案 1 :(得分:0)

查看here关于使用mergeWith和foreach数组。也许这是kamankily建议的,但使用$ criteria(不是addInCondition)