Laravel按外键获取最新记录判断字段为空后更新否则新增问题
问题原因
你原有代码未对amendments_to字段的空值状态做判断,只要匹配到send_id对应的最新记录就直接执行更新,因此不符合业务逻辑要求。
解决代码
首先获取指定send_id对应的最新OrderResponse记录,再根据字段状态判断执行更新还是新增操作:
// 获取最新的关联记录 $latestOrderResponse = OrderResponse::where('send_id', $id) ->orderBy('id', 'desc') ->first(); // 按业务规则判断执行逻辑 if ($latestOrderResponse && is_null($latestOrderResponse->amendments_to)) { // 最新记录的amendments_to为NULL,执行更新 $latestOrderResponse->update([ 'amendments_to' => $request->comment ]); } else { // 无符合条件的可更新记录,执行新增 OrderResponse::create([ 'send_id' => $id, 'amendments_to' => $request->comment, // 其余必填字段请根据你的实际业务补充 ]); }
注意事项
- 执行
create操作前,请确保OrderResponse模型的$fillable属性中已经添加了send_id、amendments_to等你要批量赋值的字段,避免触发Laravel的批量赋值保护报错。 - 如果存在并发请求的场景,建议给上述操作加数据库事务+行锁,避免出现脏写问题,示例如下:
\DB::transaction(function () use ($id, $request) { $latestOrderResponse = OrderResponse::where('send_id', $id) ->orderBy('id', 'desc') ->lockForUpdate() ->first(); if ($latestOrderResponse && is_null($latestOrderResponse->amendments_to)) { $latestOrderResponse->update([ 'amendments_to' => $request->comment ]); } else { OrderResponse::create([ 'send_id' => $id, 'amendments_to' => $request->comment, // 其余必填字段补充 ]); } });
内容的提问来源于stack exchange,提问作者ABDUL SALAM
相关产品推荐
相关产品推荐

