Yii: scope фильтрация, фильтрация по умолчанию, отмена фильтрации по умолчанию

Имеется модель (класс, наследник CActiveRecord), соответствующая некоторой таблице реляционной базы данных.
Задача — сделать так, чтобы при поиске элементов в данной таблице они изначально отфильтровывались по какому-либо критерию.

Поясню на примере. В таблице user хранятся пользователи различных типов: студенты, преподаватели, абитуриенты (тип задается значением поля role таблицы: student, prepod, abiturient). Необходимо, чтобы все возможные запросы на выборку данных из этой таблицы через данный класс изначально работали только со студентами.

Для решения данной задачи в Yii предусмотрен удобный механизм Scope, который позволяет на уровне класса для запросов задавать подобные предварительные условия.

Вот некоторые примеры кода, демонстрирующие данную возможность.

1. Scope по умолчанию

В класс-модель добавляем метод defaultScope. В нем задаем те предварительные условия, которые требуются

Теперь при обращениях к объектам этого класса мы всегда будем работать только со студентами, например

вернет всех активных студентов (без активных преподавателей и абитуриентов).

Если требуется отменить фильтр по умолчанию (по какой-либо причине), необходимо воспользоваться в запросах методом resetScope(). Пример:

2. Именованные Scope

Кроме Scope по умолчанию, вы можете задать любое число специфичных фильтров. Они задаются через переопределение метода scopes.
Пример, который реализует три фильтра: students, prepods и abiturients

В класс-модель добавляем метод scopes:

Как используем? Добавляем фильтр в запрос (предполагается, что метод defaultScope из пункта 1 данного поста не задан, иначе запросы 2 и 3 вернут пустое значение не смотря на наличие записей в таблице):

И напоследок еще несколько интересных возможностей фильтрации.

— В одном запросе могут использоваться сразу несколько фильтров.

Например, если к добавленным в п. 2 фильтрам добавить фильтр only10, который будет ограничивать вывод только 10-ю первыми записями

можно будет выполнять следующие запросы

— существует альтернативный способ создания дополнительного фильтра, который позволяет использовать параметры при вызове фильтра
Для этого необходимо добавить в класс — модель метод с уникальным именем (именем фильтра) следующего содержания:

Вызов будет таким

В отличие от предыдущего примера, сейчас мы можем сразу при вызове задавать параметры для функции фильтрации (число возвращаемых записей, например). Иногда это может оказаться полезным.

Добавить комментарий