Yii: универсальный scope для отношений
19 апреля 2011
Довольно часто простые именованные группы условий, они же scope, требуется использовать как в отношении, так для самой модели, в которой они описаны. Делается такой scope следующим образом:
public function published($val = true) { $val = (int)$val; $owner=$this->getOwner(); $criteria=$owner->getDbCriteria(); $alias=$owner->getTableAlias(); $criteria->mergeWith(array( 'condition'=>$alias.'.published='.$val, )); return $owner; }
getTableAlias
даёт нам t
, если используется сама модели и имя таблицы, если scope используется в отношении.
Комментарии RSS по email OK
а есть полный перевод справочной инфы по Yii? а то год назад все на фишлише было кроме азов
подписаться на камменты забыл)
Для подписки без коммента есть кнопочка «по email» ;)
Справочная информация == гайд?
провтыкал "по email" - внизу продублировать бы :)
справочная информация = усе про Yii :) т.е. начиная от установки ( то что ужо было вами переведено ) и заканчивая описанием функций и нюансов. наверно это и есть гайд :)
Ну, официалка давно переведена и актуализируется с каждым релизом.
Есть ещё русскоязычный эксклюзив — «Рецепты».
Ничего не понял. Вроде про скоупы и так все понятно.
Чет я не понял что есть такое "отношение"?
Ekstazi, если не задать префикс через
getTableAlias
, будет нехорошо.padavan, http://yiiframework.ru/doc/guide/ru/database.arr
Я в defaultScope базовой модели указываю:
судя по:
это пример behaviour. вот только у такого подхода со scopes в behaviours есть одни жирные грабли - они не будут работать при вложенности (там проверяется через exists и он не срабатывает в этом случае).
$a = A::model()->with('b:published')->findAll();
вот если published в b - это scope через behaviour, то он не будет виден(или у второго уровня вложенности - сейчас точно не помню, но то, что это не работает в каком-то из двух случаев - 100%). Пришлось делать наследника от AR - сейчас эти scopes видны при любом раскладе.
Это вроде фикснуто в SVN.
возможно, под trunk версией работать не можем :)
посмотрел trunk. Не уверен, что это тот случай. Смысл в том, что with срабатывает, но scopes, что были добавлены через behavior нет.
и
Оба сработают и результат должен быть разным, но будет одинаковым, т.к. 'published' не будет вызван.
P.S.: повторюсь еще раз - я не помню на каком уровне вложенности это происходит, возможно на втором(но не срабатывает 100%):
А можно в трекер добавить? Сейчас очень загружен, но после обязательно посмотрим.
Добавил. Issue: 2373
Повлияет ли на скорость приложения, использование scopes() вместо нескольких action?
Как связаны scope и action?