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
相关产品推荐
相关产品推荐

