<rmcreative>

RSS

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

  1. №4440
    BOLVERIN
    BOLVERIN 19 апр. 2011 г., 19:18:54

    а есть полный перевод справочной инфы по Yii? а то год назад все на фишлише было кроме азов

  2. №4441
    BOLVERIN
    BOLVERIN 19 апр. 2011 г., 19:19:12

    подписаться на камменты забыл)

  3. №4442
    Sam
    Sam 19 апр. 2011 г., 19:20:09

    Для подписки без коммента есть кнопочка «по email» ;)

    Справочная информация == гайд?

  4. №4443
    BOLVERIN
    BOLVERIN 19 апр. 2011 г., 19:23:01

    провтыкал "по email" - внизу продублировать бы :)

    справочная информация = усе про Yii :) т.е. начиная от установки ( то что ужо было вами переведено ) и заканчивая описанием функций и нюансов. наверно это и есть гайд :)

  5. №4444
    Sam
    Sam 19 апр. 2011 г., 20:34:29

    Ну, официалка давно переведена и актуализируется с каждым релизом.

    Есть ещё русскоязычный эксклюзив — «Рецепты».

  6. №4445
    Ekstazi
    Ekstazi 19 апр. 2011 г., 20:46:57

    Ничего не понял. Вроде про скоупы и так все понятно.

  7. №4446
    padavan
    padavan 19 апр. 2011 г., 21:11:27

    Чет я не понял что есть такое "отношение"?

  8. №4447
    Sam
    Sam 19 апр. 2011 г., 21:24:41

    Ekstazi, если не задать префикс через getTableAlias, будет нехорошо.

    padavan, http://yiiframework.ru/doc/guide/ru/database.arr

  9. №4448
    SpiLLeR
    SpiLLeR 19 апр. 2011 г., 22:09:02

    Я в defaultScope базовой модели указываю:

    public function defaultScope() {
            return array(
                'alias' => $this->tableName(),
            );
        }
  10. №4472
    Andrey Gayvoronsky
    Andrey Gayvoronsky 21 апр. 2011 г., 15:38:41

    судя по:

    $owner=$this->getOwner();

    это пример behaviour. вот только у такого подхода со scopes в behaviours есть одни жирные грабли - они не будут работать при вложенности (там проверяется через exists и он не срабатывает в этом случае).

    $a = A::model()->with('b:published')->findAll();

    вот если published в b - это scope через behaviour, то он не будет виден(или у второго уровня вложенности - сейчас точно не помню, но то, что это не работает в каком-то из двух случаев - 100%). Пришлось делать наследника от AR - сейчас эти scopes видны при любом раскладе.

  11. №4474
    Sam
    Sam 21 апр. 2011 г., 16:52:02

    Это вроде фикснуто в SVN.

  12. №4475
    Andrey Gayvoronsky
    Andrey Gayvoronsky 21 апр. 2011 г., 17:22:35

    возможно, под trunk версией работать не можем :)

  13. №4476
    Andrey Gayvoronsky
    Andrey Gayvoronsky 21 апр. 2011 г., 17:31:59

    посмотрел trunk. Не уверен, что это тот случай. Смысл в том, что with срабатывает, но scopes, что были добавлены через behavior нет.

    $a = A::model()->with('b:published')->findAll();

    и

    $a = A::model()->with('b')->findAll();

    Оба сработают и результат должен быть разным, но будет одинаковым, т.к. 'published' не будет вызван.

    P.S.: повторюсь еще раз - я не помню на каком уровне вложенности это происходит, возможно на втором(но не срабатывает 100%):

    $a = A::model()->with('b.c:published')->findAll();
  14. №4479
    Sam
    Sam 21 апр. 2011 г., 22:48:07

    А можно в трекер добавить? Сейчас очень загружен, но после обязательно посмотрим.

  15. №4497
    Andrey Gayvoronsky
    Andrey Gayvoronsky 25 апр. 2011 г., 12:43:01

    Добавил. Issue: 2373

  16. №7131
    howard
    howard 28 нояб. 2012 г., 17:51:27

    Повлияет ли на скорость приложения, использование scopes() вместо нескольких action?

  17. №7133
    Sam
    Sam 28 нояб. 2012 г., 22:37:44

    Как связаны scope и action?

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.