Может ли кто-нибудь объяснить, как работает CDbCriteria-> scopes?

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

2 ответа

Области - простой способ создания простых фильтров по умолчанию. С помощью области вы можете автоматически сортировать результаты по отдельным столбцам, ограничивать результаты, применять условия и т.д. В ссылках, предоставленных @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 элемента. Конечно, вы можете расширить этот пример почти до любого свойства в базе данных. Приветствия


Да, области могут использоваться для изменения атрибутов 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

licensed under cc by-sa 3.0 with attribution.