Кто-нибудь может объяснить, как работает CDbCriteria->scopes?
Я только что проверил справочную страницу 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