[697, 730] Любопытное поведение AR

Уже исправленные репорты или принятые предложения
Закрыто
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

[697, 730] Любопытное поведение AR

Сообщение slavcodev »

Модель

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

class Article extends CActiveRecord {
    public function behaviors() {
        return array(
            'test' => array(
                'class' => 'ext.TestBehavior.TestBehavior',
            ),
        );
    }
    public function relations() {
        return array(
            'author' => array(self::BELONGS_TO, 'User', 'authorId'),
        );
    }
    public function beforeFind($event) {
        echo 'call Article::beforeFind';
        parent::beforeFind($event);
    }
} 
Поведение

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

class TestBehavior extends CActiveRecordBehavior {
    public function beforeFind($event) {
        echo 'call TestBehavior::beforeFind';
        parent::beforeFind($event);
    }
} 
И сам контроллер

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

class ArticleController extends CController {
    public function actionList() {
        $criteria = new CDbCriteria;
        $criteria->order = $this->getFieldName('createdTime') . ' DESC';
        $withOption = array($this->getFieldName('author'));

        // вот так выполняются оба метода beforeFind
        $articles = Article::model()->findAll($criteria);

        // а так уже не выполняется ни один
        $articles = Article::model()->with($withOption)->findAll($criteria);
    }
} 
Где я ошибаюсь? Как собрать модель со всеми связями? :(
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Любопытное поведение AR

Сообщение samdark »

Не обязательно описывать в модели beforeFind + кажется, надо вернуть true. Хотя, конечно, влиять это не должно.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Любопытное поведение AR

Сообщение slavcodev »

я знаю что не обязательно, это для проверки, что оба метода не выполняются.
насчет true - в API указано protected void beforeFind()
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Любопытное поведение AR

Сообщение slavcodev »

В общем расковырял ядро, теперь остался вопрос это баг или так и должно быть :(

Повторю не работающий код

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

$articles = Article::model()->with($withOption)->find($criteria); 
Рассмотрим метод CActiveRecord::with()

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

if(func_num_args()>0) {
    $with=func_get_args();
    if(is_array($with[0])) $with=$with[0];
    $finder=new CActiveFinder($this,$with,$this->getDbCriteria(false));
    $this->_c=null;
    return $finder;
}
else return $this; 
Из этого получаем что возвращается не модель AR а новый класс ActiveFinder, значит метод find() выполняется CActiveFinder. Там ничего интересного, не буду сюда приводить, он вызывает метод CActiveFinder::query(), вот его смотрим

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

private function query($criteria,$all=false) {
    if($this->_criteria!==null) {
        $this->_criteria->mergeWith($criteria);
        $criteria=$this->_criteria;
    }
    $this->_joinTree->find($criteria);
    $this->_joinTree->afterFind();

    if($all) return array_values($this->_joinTree->records);
    else if(count($this->_joinTree->records)) return reset($this->_joinTree->records);
           else return null;
} 
Как видим afterFind() вызывается (CJoinElement::afterFind()), beforeFind() нет. Упустили или решили что он не нужен, это для меня загадка.

Для сравнения дам этот же метод query() но класса CActiveRecord, который вызывается если использовать мой код без with()

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

$articles = Article::model()->find($criteria); 

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

private function query($criteria,$all=false) {
    $this->beforeFind();
    $this->applyScopes($criteria);
    $command=$this->getCommandBuilder()->createFindCommand($this->getTableSchema(),$criteria);
    return $all ? $this->populateRecords($command->queryAll()) : $this->populateRecord($command->queryRow());
} 
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Любопытное поведение AR

Сообщение samdark »

Скорее всего пропущено.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Любопытное поведение AR

Сообщение slavcodev »

Александр, сможешь в багах засветить?
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [697] Любопытное поведение AR

Сообщение samdark »

Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [697] Любопытное поведение AR

Сообщение samdark »

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: [697] Любопытное поведение AR

Сообщение slavcodev »

пофиксили да, но все равно нельзя изменить параметры поиска :(

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

public function beforeFind($event) {
  $criteria = $this->getOwner()->getDbCriteria();
  $criteria->addCondition('status = 0');
} 
вот такой исключит строки с статусом равным 0, но только если не будет использована функция with().

:(
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [697] Любопытное поведение AR

Сообщение samdark »

Да, недофиксили… продолжаем: http://code.google.com/p/yii/issues/detail?id=697
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [697, 730] Любопытное поведение AR

Сообщение samdark »

Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: [697, 730] Любопытное поведение AR

Сообщение samdark »

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: [697, 730] Любопытное поведение AR

Сообщение slavcodev »

подтверждаю, теперь пофиксили.
Жду Yii 3!
Закрыто