Laravel更新ORDER表报1364错误:start_date字段无默认值问题咨询
错误原因
- 第一,
CarParking表的迁移文件中,start_date和end_of_free_charge两个字段未设置默认值且不允许为空,创建停车记录时没有传入这两个必填字段,直接触发数据库非空约束报错。 - 第二,
updateOrCreate方法使用逻辑错误:该方法第一个参数是查询匹配条件,第二个参数才是要更新或插入的字段值。当前把所有要修改的字段都放在了第一个参数位置,无法正确匹配已有记录,会不断生成新的无效记录。 - 第三,Order模型的关联关系定义错误:
carParkings方法返回的是CarScrap模型关联,实际应该关联CarParking模型,会导致关联保存失败。 - 第四,存在多余的数据库查询:同一请求内连续两次调用
Order::find($id),完全可以复用第一次查询的结果。
修复方案
- 先修正Order模型的关联定义
// App\Models\Order 中修改carParkings关联 public function carParkings(){ // 原来的CarScrap改为CarParking return $this->hasMany(CarParking::class); }
- 修正控制器逻辑,补全必填字段,优化查询
public function updateOrderCarParking(Request $request, $id) { if (!Auth::check()) { return response()->json([ 'success' => false, 'message' => 'Can not update', ], Response::HTTP_UNAUTHORIZED); } $carParkingData = $request->only('removed', 'removed_date'); $validateCarParking = Validator::make($carParkingData, [ 'removed' => 'required|boolean', 'removed_date' => 'nullable' ]); if ($validateCarParking->fails()) { return response()->json($validateCarParking->errors(), 422); } $orderData = $request->only('paid', 'amount_paid', 'overdue', 'currency'); $validateOrder = Validator::make($orderData, [ 'amount_paid' => 'required|regex:/^\d*+(\.\d{1,2})?$/', 'currency' => [ 'required', Rule::in(['USD', 'CAD']) ], "paid" => "required|boolean", 'overdue' => 'regex:/^\d*+(\.\d{1,2})?$/' ]); if ($validateOrder->fails()) { return response()->json($validateOrder->errors(), 422); } $order = Order::findOrFail($id); // 补全start_date、end_of_free_charge的取值逻辑,以下为示例,请根据你的实际业务修改 $carParkingData['start_date'] = now()->toDateString(); $carParkingData['end_of_free_charge'] = now()->addDays(7)->toDateString(); // 通过关联直接updateOrCreate,自动绑定order_id $updateCarParking = $order->carParkings()->updateOrCreate( // 如果一个订单对应多条停车记录,这里加查询条件定位要更新的记录,单条的话留空即可 [], $carParkingData ); // 复用之前查询的order实例更新,不需要重复查库 $order->fill($orderData); $order->user_id = Auth::user()->id; $order->save(); return response()->json([ 'success' => true, 'message' => 'Order updated successfully', 'data' => $order ], Response::HTTP_OK); }
注意:代码中
start_date和end_of_free_charge的赋值仅为示例,请根据你的实际业务需求替换为正确的取值逻辑,比如从请求参数中获取、或者从关联的其他字段计算得到。
内容的提问来源于stack exchange,提问作者chablis-omoba
相关产品推荐
相关产品推荐

