У меня есть массив элементов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.
Благодарим за участие!
Вы пробовали ['CDbCriteria :: addInCondition'] (http://www.yiiframework.com/doc/api/1.1/CDbCriteria#addInCondition- подробно)? – DCoder
Нет, я постараюсь сегодня, спасибо! – fcmax
«сохранить оставшееся без ответа количество» Как я могу это сделать? – fcmax