2012-06-02 3 views
1

У меня есть массив элементовYii CDbCriteria - ИЛИ и Еогеасп()

$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()? О пользовательских подготовленной состоянии, я знаю, но это к громоздким;)


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. Немного изменить условие: 'condition' => 'LOWER (city) REGEXP: city'

Это связано с тем, что MySQL lib REGEXP плохо работает с utf-8.

Благодарим за участие!

+1

Вы пробовали ['CDbCriteria :: addInCondition'] (http://www.yiiframework.com/doc/api/1.1/CDbCriteria#addInCondition- подробно)? – DCoder

+0

Нет, я постараюсь сегодня, спасибо! – fcmax

+0

«сохранить оставшееся без ответа количество» Как я могу это сделать? – fcmax

ответ

1

Позвольте попробовать addInCondition, первым параметром является условие (например, 'cite LIKE \' London \ ''), а второй - оператор (ИЛИ или И).

Вы можете выделить массив (город) и использовать addInCondition.

+0

Что относительно% города%? «%» не работают с «IN». – fcmax

+2

Я решил эту проблему следующим образом: $ citiesStr = implode ('|', $ cities); // Преобразование в REGEXP $ this-> getDbCriteria() -> mergeWith (array ( 'condition' => 'city REGEXP: city', 'params' => array (': city' => $ citiesStr) , )); return $ this; – fcmax

0

Посмотрите here об использовании mergeWith и foreach array. Возможно, это то, что kamankily предлагает, но используя $ критерии (не addInCondition)

Смежные вопросы