You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

每次提交表单时如何向已存储的total_value累加新输入的数值

当前代码的UPDATE操作直接覆盖了total_value字段的历史值,没有做累加处理,因此无法实现多次提交数值累计的需求。


方案1:数据库层面直接累加(推荐,无并发覆盖风险)

直接在SQL语句中完成历史值+新值的计算,同时使用参数绑定避免SQL注入隐患:

// 替换原有UPDATE代码段
Yii::$app->db->createCommand(
    'UPDATE ebs_booking_transaction SET total_value = COALESCE(total_value, 0) + :new_total WHERE id = :trans_id',
    [
        ':new_total' => $total,
        ':trans_id' => $trans
    ]
)->execute();

代码说明:

  • COALESCE(total_value, 0)用于处理首次提交时total_value为NULL的场景,会自动将NULL转换为0再做累加计算
  • 参数绑定写法替代了直接拼接SQL,彻底避免SQL注入安全问题

如果你有对应ebs_booking_transaction表的ActiveRecord模型,还可以使用Yii2原生的计数器更新方法,写法更简洁:

EbsBookingTransaction::updateAllCounters(
    ['total_value' => $total],
    ['id' => $trans]
);

方案2:PHP层面先查后算(仅适用于低并发场景)

如果需要在PHP代码中获取累加前的历史值做其他业务逻辑处理,可以先查询历史值再更新:

// 查询历史累计值
$oldTotal = (new \yii\db\Query())
    ->select('total_value')
    ->from('ebs_booking_transaction')
    ->where(['id' => $trans])
    ->scalar();
$finalTotal = (float)$oldTotal + $total;

// 执行更新
Yii::$app->db->createCommand(
    'UPDATE ebs_booking_transaction SET total_value = :final_total WHERE id = :trans_id',
    [
        ':final_total' => $finalTotal,
        ':trans_id' => $trans
    ]
)->execute();

内容的提问来源于stack exchange,提问作者Rejxil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:27:03