1

这很好用:

   $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]: Invalid parameter number: 绑定变量数与标记数不匹配。执行的 SQL 语句为:UPDATE test_nested_setSET left_nr=:yp0, right_nr=:yp1 WHERE left_nr>=:left_nr AND right_nr>=:right_nr

我怎样才能实现它?

4

3 回答 3

1

您的代码是错误的,您可以通过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()

更新一个或多个计数器列。请注意,除非指定条件或条件,否则这会更新所有数据行。

于 2014-11-04T23:00:36.170 回答
1

你也可以这样尝试

User::model()->updateAll(array(
    'field_name'=> new CDbExpression('field_name + 1')),
    "u_id = 10"
);
于 2016-08-04T13:07:53.847 回答
1

在 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'
于 2017-07-26T11:48:52.060 回答