使用updateAll()递增列值的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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 SET left_nr =:yp0,right_nr =:yp1 WHERE left_nr> =:left_nr AND right_nr> =:right_nr

我怎样才能实现它?

答案

你的代码是错误的,你可以像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()

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

另一答案

你也可以这样试试

User::model()->updateAll(array(
    'field_name'=> new CDbExpression('field_name + 1')),
    "u_id = 10"
);
另一答案

在Yii2

将它放在您的控制器上:

use yiidbExpression;

在您的操作中,您可以按如下方式更新计算列:

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

以上产生以下SQL语句:

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

以上是关于使用updateAll()递增列值的值的主要内容,如果未能解决你的问题,请参考以下文章

PySpark - 添加一个递增的数字列,该列根据另一列值的变化重置为 1

实体框架递增列值而不查询它之前

有没有一种有效的方法来计算 Pandas 中的列值,使用基于其他列的条件值的前行的值?

如何在mysql,php的单个查询中设置与自动递增ID值相同的任何列值[重复]

插入表格并将另一列设置为自动递增的列值

按列值的差异对 SQL 中的数据进行分组