Увеличение значения столбца с помощью 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"
);