Страница 1 из 1

CActiveRecord, updateAll + join

Добавлено: 2011.01.12, 00:17
Ekstazi
Есть следующий код

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

        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.

Re: CActiveRecord, updateAll + join

Добавлено: 2011.01.12, 00:29
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 альясы не до конца реализованы....

Re: CActiveRecord, updateAll + join

Добавлено: 2011.01.12, 00:46
Ekstazi
Кстати, стоит проверить на такие ошибки и методы insert и delete

Re: CActiveRecord, updateAll + join

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

Re: CActiveRecord, updateAll + join

Добавлено: 2011.01.12, 02:18
samdark
Хочу. Если к этому будет ещё и юнит-тест — будет вообще круто.

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

Re: CActiveRecord, updateAll + join

Добавлено: 2011.01.12, 13:08
Ekstazi
Это до воскресенья ?

Re: CActiveRecord, updateAll + join

Добавлено: 2011.01.12, 13:18
samdark
До субботы. Ну или в 1.1.7 пойдёт.

Re: CActiveRecord, updateAll + join

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

Re: CActiveRecord, updateAll + join

Добавлено: 2016.09.13, 14:30
gadtakoi
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, нельзя ли этот алиас добавить в ветку?

Re: CActiveRecord, updateAll + join

Добавлено: 2016.09.16, 13:23
samdark
Делайте пулл реквест, посмотрим. Сам пока сделать не могу. В дороге.