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

Laravel更新ORDER表报1364错误:start_date字段无默认值问题咨询

错误原因
  • 第一,CarParking表的迁移文件中,start_date和end_of_free_charge两个字段未设置默认值且不允许为空,创建停车记录时没有传入这两个必填字段,直接触发数据库非空约束报错。
  • 第二,updateOrCreate方法使用逻辑错误:该方法第一个参数是查询匹配条件,第二个参数才是要更新或插入的字段值。当前把所有要修改的字段都放在了第一个参数位置,无法正确匹配已有记录,会不断生成新的无效记录。
  • 第三,Order模型的关联关系定义错误:carParkings方法返回的是CarScrap模型关联,实际应该关联CarParking模型,会导致关联保存失败。
  • 第四,存在多余的数据库查询:同一请求内连续两次调用Order::find($id),完全可以复用第一次查询的结果。
修复方案
  1. 先修正Order模型的关联定义
// App\Models\Order 中修改carParkings关联
public function carParkings(){
    // 原来的CarScrap改为CarParking
    return $this->hasMany(CarParking::class);
}
  1. 修正控制器逻辑,补全必填字段,优化查询
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:06:03