Для создания групп услови запроса в Yii предусмотрен удобный механизм Scope, который позволяет на уровне класса CActiveRecord задавать предварительные условия. В этой статье я покажу на примере, как использовать Scope в Yii.
Группа условий по умолчанию
class Content extends CActiveRecord
{
public function defaultScope()
{
return array(
'condition'=>'status=1',
'order'=>'create_time DESC',
'limit'=>5,
);
}
}
Теперь при выполнении $posts = Content::model()->findAll() будут применятся условия, описанные выше в модели.
Если требуется отменить фильтр по умолчанию (по какой-либо причине), необходимо воспользоваться в запросах методом resetScope(). Пример: $posts = Content::model()->resetScope()->findAll()
Именованные Scope
Кроме Scope по умолчанию, вы можете задать любое число специфичных фильтров. Они задаются через переопределение метода scopes. Пример, который реализует три фильтра: students, prepods и abiturients
public function scopes()
{
return array(
'students'=>array('condition'=>"role='student'"),
'prepods'=>array('condition'=>"role='prepods'"),
'abiturients'=>array('condition'=>"role='abiturients'"),
);
}
//вызов
$students = Users::model()->students()->findAll("active=1"); // все активные студенты
$prepods= Users::model()->prepods()->findAll("active=1"); // все активные преподаватели
$abiturients = Users::model()->abiturients()->findAll("active=1"); // все активные абитуриенты
В одном запросе могут использоваться сразу несколько фильтров.
public function scopes()
{
return array(
'students'=>array('condition'=>"role='student'"),
'prepods'=>array('condition'=>"role='prepods'"),
'abiturients'=>array('condition'=>"role='abiturients'"),
'only10'=>array('limit'=>10, 'order'=>'id desc'),
);
}
//вызов
$students = Users::model()->students()->only10()->findAll("active=1"); // не более 10 активных студентов из последних добавленных
Существует альтернативный способ создания дополнительного фильтра, который позволяет использовать параметры при вызове фильтра
public function onlyXY($limit, $order)
{
$this->getDbCriteria()->mergeWith(array(
'limit' => $limit,
'order' => $order
));
return $this;
}
//вызов
$students = Users::model()->students()->onlyXY(10, 'id desc')->findAll("active=1"); // не более 10 активных студентов из последних добавленных