CActiveRecord::__get()

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Аватара пользователя
MaxHero
Сообщения: 144
Зарегистрирован: 2011.09.12, 04:34
Откуда: Украина, Киев

CActiveRecord::__get()

Сообщение MaxHero »

На днях понадобилось в AR модели переопределить метод getRelated():

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

public function getRelated($name, $refresh = false, $params = array())
{
    if (!empty($this->relationRefreshFlags[$name])) {
        $refresh = true;
        $this->relationRefreshFlags[$name] = false;
    }

    return parent::getRelated($name, $refresh, $params);
}
 
Т.е. в зависимости от неких условий мы принудительно хотим заставить обновить связанные (relation) модели.

Однако в методе __get():

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

public function __get($name)
{
    if(isset($this->_attributes[$name]))
        return $this->_attributes[$name];
    elseif(isset($this->getMetaData()->columns[$name]))
        return null;
    elseif(isset($this->_related[$name]))
        return $this->_related[$name];
    elseif(isset($this->getMetaData()->relations[$name]))
        return $this->getRelated($name);
    else
        return parent::__get($name);
}
Видим, что при вызове $model->relationName в первую очередь проверяется наличие моделей в кэше и только потом "дергается" getRelated(), что сводит на нет наше желание переопределить поведение кэша. Разумеется понятно, что можно получать связанные модели способом $model->getRelated('relationName'), однако $model->relationName ИМХО лучше читается.

Не могли бы пояснить, почему данный метод не имеет вид:

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

public function __get($name)
{
    if(isset($this->_attributes[$name]))
        return $this->_attributes[$name];
    elseif(isset($this->getMetaData()->columns[$name]))
        return null;
    elseif(isset($this->getMetaData()->relations[$name]))
        return $this->getRelated($name);
    else
        return parent::__get($name);
}
? Ведь в getRelated() проверка на наличие моделей в кэше уже реализована.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CActiveRecord::__get()

Сообщение slavcodev »

ооо, на прошлой недели решал эту проблему, думал это я один такой хитрый, залез в метод getRalated. Оказывается не один.
Может действительно может кто-то объяснить почему не дергать getRelated в __get, там ведь тоже проверяется кеш.
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CActiveRecord::__get()

Сообщение slavcodev »

У меня задача была чтоб для определенной связи создавать ее если ее нет

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

public function getRelated($name, $refresh = false, $params = array())
{
    $related = parent::getRelated($name, $refresh, $params);

    // Create default related poi.
    if ('poi' === $name && null === $related) {
        $related = $this->instantiatePoi();
        $this->addRelatedRecord('poi', $related, false);
    }
    return $related;
} 
я подумал что самый верный метод именно тут это проверять, пришлось выкручиваться из-за тойже проблемы что и топикстартера
Жду Yii 3!
Ответить