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

Laravel更新数据时报Creating default object from empty value错误如何解决

问题原因

你报错的核心原因是提交的请求中携带的id无法在services表中匹配到对应记录:

  • 调用findOrFail()时找不到匹配记录就会直接抛出404异常,符合你观察到的现象
  • 调用find()时找不到匹配记录会返回null,你尝试给null对象的title属性赋值,自然会触发错误

排查&修复步骤

1. 校验请求参数

先打开方法第一行的注释,确认请求返回结果中存在id字段,且字段值和你要更新的Service记录主键一致:

return $request->all();

重点检查前端提交表单中是否正确携带了id字段,有没有字段名拼写错误。

2. 补充非空判断

查询后先判断模型是否存在,避免对null赋值:

$service = Service::find($request->input('id'));
if (!$service) {
    return back()->withErrors(['id' => '要更新的服务不存在'])->withInput();
}

3. 修复代码冗余&逻辑错误

  • 图片处理部分不需要重复查询Service模型,直接复用已经查到的$service即可
  • 原旧图片判断逻辑错误,你之前是把模型实例和字符串比较,应该直接读取模型的image属性判断
  • 更新slug的唯一性验证规则,排除当前要更新的记录,否则不改slug提交会触发重复校验报错
  • 已经手动赋值模型属性的情况下,调用save()方法即可,不需要用update()

修正后完整代码

public function updateService(Request $request){
    $this->validate($request, [
        'serviceTitle'=> 'required',
        'serviceSubTitle'=> 'required',
        'description'=> 'required',
        // 唯一性规则排除当前记录
        'slug' => 'required|min:3|max:255|unique:services,slug,'.$request->input('id'),
        'serviceImage'=>'image|nullable|max:1999'
    ]);
    
    $service = Service::find($request->input('id'));
    if (!$service) {
        return back()->withErrors(['id' => '要更新的服务不存在'])->withInput();
    }

    $service->title = $request->input('serviceTitle');
    $service->sub_title = $request->input('serviceSubTitle');
    $service->slug = $request->input('slug');
    $service->description = $request->input('description');
    
    if($request->hasFile('serviceImage')) {
        //1 : get filename with ext
        $fileNameWithExt = $request->file('serviceImage')->getClientOriginalName();
        //2 : get just file name
        $fileName = pathinfo($fileNameWithExt, PATHINFO_FILENAME);
        //3 : get just extension
        $extension = $request->file('serviceImage')->getClientOriginalExtension();
        //4: filename to store
        $fileNameToStore = $fileName.'_'.time().'.'.$extension;
        //upload image
        $path = $request->file('serviceImage')->storeAs('public/serviceImage', $fileNameToStore);
        
        // 删除旧图片
        if($service->image != 'noimage.jpg') {
            Storage::delete('public/serviceImage/'.$service->image);
        }
        $service->image = $fileNameToStore;
    }
    
    $service->save();
    return redirect('/services')->with('status', 'The '.$service->title.' Service has been updated successfully');
}

内容的提问来源于stack exchange,提问作者Wanjila Abraham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 17:36:05