每次提交表单时如何向已存储的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
相关产品推荐
相关产品推荐

