Заметки WEB-разработчика

Полезные материалы для web-разработки

Именованные группы условий (scope) в yii

Для создания групп услови запроса в Yii предусмотрен удобный механизм Scope, который позволяет на уровне класса CActiveRecord задавать предварительные условия.  В этой статье я покажу на примере, как использовать Scope в Yii.

Именованные группы условий (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 активных студентов из последних добавленных

Комментарии

Комментарии через Вконтакте