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

