Laravel5.6多图上传关联模型报错:imageable_id无默认值
解决Laravel多图关联时SQLSTATE[HY000]: 1364 Field 'imageable_id' 无默认值错误
这个错误的核心原因很明确:你在保存Image实例的时候,还没给它关联对应的Service模型,导致imageable_id和imageable_type这两个关联字段是空的,而数据库里这两个字段没有设置默认值,所以触发了SQL报错。
看你代码里的这两行:
$image->save(); $service->images()->save($image);
第一行的$image->save()完全是多余的!因为$service->images()->save($image)这个方法会自动把当前Service的id和模型类型填充到Image的imageable_id和imageable_type字段里,然后自动完成保存操作。你提前手动调用save(),相当于在没有关联信息的情况下强行插入数据,自然会报错。
修改后的正确Store方法
把多余的$image->save()删掉就可以解决问题,优化后的代码如下:
public function store(Request $request) { session()->flash('status', $request->status); $request->validate([ 'title' => 'required|between:5,255', 'content' => 'required|min:10', 'files.*' => 'file|image|mimes:jpeg,png|max:2048', ]); // 创建并保存Service模型,用create写法更简洁 $service = Service::create([ 'title' => $request->title, 'content' => $request->content, 'status' => $request->status, ]); if($request->hasFile('files')) { collect($request->file('files'))->each(function ($file) use($service) { $newFile = $file->store('public/images'); // 直接创建Image并关联到Service,一步完成 $image = new \App\Image([ 'img_url' => $newFile ]); $service->images()->save($image); // 或者更简洁的写法:使用create方法直接创建并关联 // $service->images()->create([ // 'img_url' => $newFile // ]); }); } return redirect(route('admin.services.index'))->with('success', trans('Kayıt başarıyla eklendi')); }
额外优化建议
- 用
Service::create()替代手动赋值+save的写法,代码更简洁易读。 - 如果你不需要单独操作
Image实例,直接用$service->images()->create()方法会更高效,省去手动创建实例的步骤。 - 确保你的
images数据库表中,imageable_id和imageable_type这两个字段是非空的(从报错来看已经是这样了),这符合多态关联的设计规范。
内容的提问来源于stack exchange,提问作者tutkun
相关产品推荐
相关产品推荐

