Кто-нибудь может объяснить, как работает CDbCriteria-> scopes? - PullRequest
4 голосов
/ 29 июня 2011

Я только что проверил справочную страницу CDbCriteria, но недостаточно информации об этом. Это свойство доступно начиная с v1.1.7, и я не смог найти для него никакой помощи. Это для динамического изменения Model->scopes "на лету"?

Ответы [ 2 ]

13 голосов
/ 30 июня 2011

Области - это простой способ создания простых фильтров по умолчанию.С помощью области вы можете автоматически сортировать результаты по определенным столбцам, ограничивать результаты, применять условия и т. Д. В ссылках, предоставляемых @ldg, есть большой пример того, насколько они крутые:

$posts=Post::model()->published()->recently()->findAll();

Кто-тоизвлечение всех недавно опубликованных постов в одну строку.Их легче поддерживать, чем встроенные условия (например, Post::model()->findAll('status=1')), и они инкапсулированы внутри каждой модели, что означает большую прозрачность и простоту использования.

Кроме того, вы можете создавать свои собственные области на основе параметров, например:

public function last($amount)
{
    $this->getDbCriteria()->mergeWith(array(
        'order' => 't.create_time DESC',
        'limit' => $amount,
    ));
    return $this;
}

Добавление чего-то подобного в модель позволит вам выбрать количество объектов, которые вы хотите извлечь из базы данных (отсортировано по времени создания).Возвращая сам объект, вы разрешаете цепочку методов.

Вот пример:

$last3posts=Post::model()->last(3)->findAll();

Получает последние 3 элемента.Конечно, вы можете расширить пример практически до любого свойства в базе данных.Приветствия

4 голосов
/ 29 июня 2011

Да, области действия могут использоваться для изменения атрибутов CDbCriteria с предварительно созданными условиями, а также могут передаваться параметры. До версии 1.1.7 вы могли использовать их в запросе model (), и их можно объединить в цепочку. Увидеть: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes

Начиная с версии 1.1.7, вы также можете использовать области как свойство CDbCriteria. Смотри: http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-named-scopes

...