CActiveRecord, updateAll + join

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

CActiveRecord, updateAll + join

Сообщение Ekstazi » 2011.01.12, 00:17

Есть следующий код

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

        BirthDay::model()->updateAll(array(
            'type'=>'inactive',
        ),array(
            'join'=>'left join Salon s on s.Id=t.idSalon',
            'condition'=>'s.`birthDay`>:date',
            'params'=>array(
                ':date'=>$start
            )
        ));
 
Который формирует такой запрос:

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

UPDATE `BirthDay` SET `type`=:yp0 left join Salon s on s.Id=t.idSalon WHERE s.`birthDay`>:date
Который соответствено исполняется с ошибкой, так как join не на своем месте.
Причина ошибки в CDbCommandBuilder, createUpdateCommand(строка 268):

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

        $sql="UPDATE {$table->rawName} SET ".implode(', ',$fields);
        $sql=$this->applyJoin($sql,$criteria->join);
 
Правильно примерно так:

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

        
               $sql="UPDATE {$table->rawName}";
               $sql=$this->applyJoin($sql,$criteria->join);
               $sql.=" SET ".implode(', ',$fields);
 
Я не проверял с другими атрибутами CDbCriteria.

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CActiveRecord, updateAll + join

Сообщение Ekstazi » 2011.01.12, 00:29

alias кстати тоже не используется, вот код который это дело исправляет:

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

        if($criteria->alias!='')
            $alias=$criteria->alias;
        else $alias=null;
        $alias=$alias ? $this->_schema->quoteTableName($alias) : '';

        $sql="UPDATE {$table->rawName} {$alias}";
        $sql=$this->applyJoin($sql,$criteria->join);
        $sql.=" SET ".implode(', ',$fields);
 
Патч, к, сожалению, не вышло подготовить, но, думаю, и так понятно.
P.S.: Это всего лишь костыль, так как в CDbCommandBuilder альясы не до конца реализованы....

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CActiveRecord, updateAll + join

Сообщение Ekstazi » 2011.01.12, 00:46

Кстати, стоит проверить на такие ошибки и методы insert и delete

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CActiveRecord, updateAll + join

Сообщение Ekstazi » 2011.01.12, 00:54

Sam, если хочешь, я могу добавить изменения в эту часть для поддержки альясов(я про insert и delete) и протестировать на пример багов.

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

Re: CActiveRecord, updateAll + join

Сообщение samdark » 2011.01.12, 02:18

Хочу. Если к этому будет ещё и юнит-тест — будет вообще круто.

Если хочется это в 1.1.6 — надо торопиться, он в конце недели.

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CActiveRecord, updateAll + join

Сообщение Ekstazi » 2011.01.12, 13:08

Это до воскресенья ?

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

Re: CActiveRecord, updateAll + join

Сообщение samdark » 2011.01.12, 13:18

До субботы. Ну или в 1.1.7 пойдёт.

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CActiveRecord, updateAll + join

Сообщение Ekstazi » 2011.01.12, 13:48

Попутно возникло множество вопросов, чтоб я не трогал что не надо. Чтоб все пошло как-то оперативней написал тебе в gtalk.

gadtakoi
Сообщения: 1
Зарегистрирован: 2016.09.13, 14:22

Re: CActiveRecord, updateAll + join

Сообщение gadtakoi » 2016.09.13, 14:30

Ekstazi писал(а):alias кстати тоже не используется, вот код который это дело исправляет:

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

        if($criteria->alias!='')
            $alias=$criteria->alias;
        else $alias=null;
        $alias=$alias ? $this->_schema->quoteTableName($alias) : '';

        $sql="UPDATE {$table->rawName} {$alias}";
        $sql=$this->applyJoin($sql,$criteria->join);
        $sql.=" SET ".implode(', ',$fields);
 
Патч, к, сожалению, не вышло подготовить, но, думаю, и так понятно.
P.S.: Это всего лишь костыль, так как в CDbCommandBuilder альясы не до конца реализованы....
Sam, нельзя ли этот алиас добавить в ветку?

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

Re: CActiveRecord, updateAll + join

Сообщение samdark » 2016.09.16, 13:23

Делайте пулл реквест, посмотрим. Сам пока сделать не могу. В дороге.

Ответить