Привет! Ребята, есть вопрос такого характера. Имею таблицу posts в базе данных с полем lang которое определяет язык записи. Кроме того, это поле может принимать значение " * " (звездочка), означающая что эта запись выводится по умолчанию. Таким образом у меня в CActiveRecord имеется defaultScope такого содержания
Код: Выделить всё
public function defaultScope() {
return array(
'condition' => "lang = :lang OR lang = '*'",
'params' => array(':lang' => Yii::app()->language)
);
}
Получить записи либо текущего языка, либо записи по умолчанию. Этот код хорошо работает до тех пор, пока не появляются записи текущего языка, в этом случае, данный код вместо ожидаемых записей lang = "ru" вернет еще и записи lang = "*". Что в данном случае не нужно. Мне нужно сделать так, что бы мне возвращались записи лишь нужного языка, а записи вида * возвращались в том, случае, если нужного языка нет. Можно, конечно, сделать за два запроса, что-то в духе
Код: Выделить всё
public function defaultScope() {
return array(
'condition' => "lang = :lang OR lang = '*'",
'params' => array(':lang' => Yii::app()->language)
);
}
public function lang($lang = '*'){
$this->getDbCriteria()->mergeWith(array(
'condition' => "lang = :lang",
'params' => array(':lang' => $lang)
));
}
Код: Выделить всё
if(!$posts = Post::model()->findAll()){
$posts = Post::model()->lang('*')->findAll();
}
Но использовать два запроса, как-то не правильно. Гораздо, правильнее, на мой взгляд, получать сразу записи текущего языка и записи по умолчанию и что бы модель уже работала с массивом, возвращая мне лишь необходимое. Что бы при запросе вида
Я получил либо записи с текущим языком, если таковые есть, либо записи по умолчанию. Как бы вы реализовали такую задачу по изящнее?