【问题标题】:incrementing value of column value with updateAll()使用 updateAll() 增加列值的值
【发布时间】:2014-11-04 22:28:46
【问题描述】:

这很好用:

   $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

我怎样才能实现它?

【问题讨论】:

    标签: yii yii2 yii-cactiverecord cactiverecord


    【解决方案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()

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

    【讨论】:

      【解决方案2】:

      在 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'
      

      【讨论】:

        【解决方案3】:

        你也可以这样试试

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-05
          • 1970-01-01
          • 1970-01-01
          • 2016-04-29
          • 1970-01-01
          • 1970-01-01
          • 2020-04-02
          相关资源
          最近更新 更多