簡體   English   中英

使用updateAll()增加列值的值

[英]incrementing value of column value with 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 yii\db\Expression;

您可以按照以下操作更新計算列:

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

上面產生了以下SQL語句:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM