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

Laravel中updateOrCreate执行加法操作新建记录字段为null如何解决?

问题根因

你当前代码的问题出在新建购物车记录的场景下:数据库中还没有对应行的price字段值,DB::raw("price + $request->price") 中的price取值为null,null参与数值运算的结果仍为null,因此新建的记录price字段始终为空。

修复方案

方案1:修改原生SQL逻辑兼容空值(改动最小)

使用数据库的COALESCE函数处理null值,该函数会返回传入参数中的第一个非null值,新建场景下price为null时就用0作为初始值累加:

// 建议用参数绑定避免SQL注入风险,不要直接拼接请求参数到SQL语句
$cart = Cart::updateOrCreate(
    ['order_id' => $order->id, 'product_id' => $request->product_id],
    ['price' => DB::raw("COALESCE(price, 0) + ?", [$request->price])]
);

如果你的数据库用的是MySQL,也可以用IFNULL(price, 0)替代COALESCE(price, 0),效果一致。

方案2:拆分查询和写入逻辑(可读性更高、更安全)

不依赖原生SQL,先查询是否存在对应购物车记录,存在就调用increment方法累加金额,不存在就新建记录:

$cart = Cart::where('order_id', $order->id)
    ->where('product_id', $request->product_id)
    ->first();

if ($cart) {
    // 增量更新price字段,第二个参数为累加值
    $cart->increment('price', $request->price);
} else {
    $cart = Cart::create([
        'order_id' => $order->id,
        'product_id' => $request->product_id,
        'price' => $request->price
    ]);
}

注意事项

  • 确保数据库price字段为数值类型,推荐用decimal类型存储金额,避免浮点精度丢失,不要使用字符串类型
  • 所有用户传入的参数都不要直接拼接进SQL语句,使用参数绑定或Laravel提供的查询构造器方法可以避免SQL注入风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:36:03