defaultScope и alias

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

defaultScope и alias

Сообщение kukuruku »

как правильно использовать alias чтобы избежать конфликтов в очень сложных запросах с джойнами?
даже если указываю явно alias все равно ругается, может оно не приспособлено для этого?
если не использовать джойны то все ок
ostin
Сообщения: 83
Зарегистрирован: 2009.10.10, 15:55
Контактная информация:

Re: defaultScope и alias

Сообщение ostin »

я у себя в моделях делал так:

Код: Выделить всё

public function scopes() {
    $t = $this->getTableAlias();
    return CMap::mergeArray(parent::scopes(), array(
        'moderation' => array('condition' => $t . '.status=:cmstatus', 'params' => array(':cmstatus' => self::STATUS_MODERATION)),
        'own' => array('condition' => $t . '.user=:couser', 'params' => array(':couser' => Yii::app()->user->id)),
    ));
}
 
В родительском классе общие для всех scopes, поэтому использовал mergeArray. Стоит обратить внимание на параметры в запросе. Т.к. они подставляются в общий уже сформированный (порой, очень большой) запрос, приходится следить, чтобы их названия не пересекались. Например, :status легко может незаметно конфликтовать. Отлаживается все это очень долго. Нужно следить за уникальностью передаваемых параметров. (cmstatus, couser в примере)

defaultScope в родительской модели такой:

Код: Выделить всё

public function defaultScope() {
    $t = $this->getTableAlias(false, false);
    return array('condition' => $t . '.status!=:ardsStatus', 'params' => array(':ardsStatus' => self::STATUS_DELETED));
}
 
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: defaultScope и alias

Сообщение kukuruku »

слабо что понял
тут вопрос скорее теоретический- что менее затратно для сложных запросов, писать defaultScope с всякими заморочками или каждый раз в запросе указывать условия
как мне кажется defaultScope хорош только для тривиальных запросов для одной, максимум двух таблиц
ostin
Сообщения: 83
Зарегистрирован: 2009.10.10, 15:55
Контактная информация:

Re: defaultScope и alias

Сообщение ostin »

Я понял, что вопрос по технической реализации, а не идеологический :)

В первую очередь надо ответить на вопрос: менее затратно для БД, для PHP, для разработки или для поддержки? Если нужна оптимизация запросов к БД - тут только руками писать запросы. Это же даст прибавку в производительности PHP, т.к. не придется строить эти самые запросы.

Вот как использую scopes я:
* во всех таблицах у меня есть поле status, которое отвечает за статус записи. Записи из таблиц я не удаляю, а только присваиваю статус Deleted.
* все модели наследуются от родительского ActiveRecord, где прописано в defaultScopes status!='Deleted'. Таким образом, по умолчанию любая выборка любых записей исключит удаленные.
* в родительском ActiveRecord есть стандартные scopes по статусу и другим полям. Например, status='Active'.
* в каждой конкретной модели в scopes добавляю необходимые условия по необходимости.

При сложных запросах, например, при использовании связей, могут вылезти трудноотлавливаемые баги или особенности работы. Не рекомендую использовать scopes для всего подряд, можно сесть на грабли. Для разового запроса лучше сделать findAllByCriteria, чем прописывать scope.
Ответить