Увеличение значения столбца с помощью updateAll()

Это работает очень хорошо:

   $test = self::updateAll(
                        array( 'left_nr' => '3',
                               'right_nr' => '3', ),
                        'left_nr>=:left_nr AND right_nr>=:right_nr',
                        array(
                            ':left_nr' => $parent->left_nr,
                            ':right_nr' => $parent->right_nr,
                            //':new_left_nr' => 'left_nr + 2',
                            //':new_right_nr' => 'right_nr + 2'

                        )
                    );

но то, что я хочу, это:

   $test = self::updateAll(
                        array( 'left_nr' => ':new_left_nr',
                               'right_nr' => ':new_right_nr', ),
                        'left_nr>=:left_nr AND right_nr>=:right_nr',
                        array(
                            ':left_nr' => $parent->left_nr,
                            ':right_nr' => $parent->right_nr,
                            ':new_left_nr' => 'left_nr + 2',
                           ':new_right_nr' => 'right_nr + 2'

                        )
                    );

Когда я пробую этот код, я получаю следующую ошибку:

CDbCommand не удалось выполнить инструкцию SQL: SQLSTATE[HY093]: недопустимый номер параметра: число связанных переменных не соответствует количеству токенов. Выполнено SQL-выражение: UPDATE test_nested_set ЗАДАВАТЬ left_nr=: Yp0, right_nr=: yp1 ГДЕ left_nr>=:left_nr И right_nr>=:right_nr

Как мне этого добиться?

3 ответа

Решение

Ваш код неверен, вы можете достичь этой цели с помощью чего-то вроде updateCounters() как ниже:

<?php

$test = self::model()->updateCounters(
    array(
        'left_nr' => 2, // this is equal to => left_nr = left_nr+2
        'right_nr' => 2
    ), 
    'left_nr >= :left_nr AND right_nr >= :right_nr',
    array(
        ":left_nr" => $parent->left_nr,
        ":right_nr" => $parent->right_nr,
    )
);

?>

Yii определяет UpdateCounters():

Обновляет один или несколько столбцов счетчика. Обратите внимание, это обновляет все строки данных, если не указано условие или критерий.

На Yii2

Поместите это сверху вашего контроллера:

use yii\db\Expression;

По вашему действию вы можете обновить вычисляемый столбец следующим образом:

Testlog::updateAll(['duration' => new Expression('duration + (5*60)')], 
                   ['testlogid' => $tid]);

Выше приведено следующее выражение SQL:

UPDATE `testlog` SET `duration`=duration + (5*60) WHERE `testlogid`='15'

Вы также можете попробовать вот так

User::model()->updateAll(array(
    'field_name'=> new CDbExpression('field_name + 1')),
    "u_id = 10"
);
Другие вопросы по тегам