Laravel中如何向关联的thumbnails、recipes表插入数据并修复报错
问题修复
你代码里的报错和关联逻辑问题按以下方式修改即可:
- 变量作用域问题:
$name/$size/$path三个变量定义在文件上传的if判断块内部,未传文件时变量不会初始化,外部调用直接报未定义错误,需要把变量初始化移到判断外 - 模型create传参错误:
create()方法接收一维键值对数组,你当前传的是嵌套二维数组;字段名和表结构不匹配(缩略图文件名字段是thumbnail不是thumbnails);错误使用$request->$name动态属性写法,$name本身就是拿到的文件名,不需要再从请求实例中取值 - 外键关联逻辑错误:recipes表的
thumbnail_id关联thumbnails表主键,不能直接从请求取不存在的参数,需要先保存缩略图数据,拿到生成的主键id再给recipes表赋值 - 其他冗余/错误代码:提前new模型对象的操作多余、未补全两张表必填的用户外键、recipes表字段和表结构不匹配(不存在
name/file字段,对应字段是title)、create后多余调用save()、成功提示文案写的是删除成功、跳转到详情页未传菜谱id参数
修正后的可运行代码如下:
public function store(StorerecipesRequest $request) { // 初始化文件属性变量,避免未定义报错 $name = null; $size = null; $path = null; if ($request->hasFile('thumbnails')) { $name = $request->file('thumbnails')->getClientOriginalName(); $size = $request->file('thumbnails')->getSize(); $path = $request->file('thumbnails')->storeAs('public/Recipes/thumbnails', $name); } // 保存缩略图数据,字段和表结构对齐,补全用户关联外键 $thumbnail = thumbnails::create([ 'user_id' => auth()->id(), 'thumbnail' => $name, 'path' => $path, 'size' => $size, // 如有需要可在这里生成slug字段,例:'slug' => Str::slug($name . time()) ]); // 保存菜谱数据,关联刚创建的缩略图ID $recipe = recipes::create([ 'user_ID' => auth()->id(), 'cuisines_id' => $request->cuisines_id, 'category_id' => $request->category_id, 'thumbnail_id' => $thumbnail->id, 'title' => $request->title, 'slug' => $request->slug, 'dsescription' => $request->dsescription, 'youtubevideo' => $request->youtubevideo, 'method' => $request->method, 'difficlty' => $request->difficlty, 'preptime' => $request->preptime, 'cooktime' => $request->cooktime, 'total' => $request->total, 'servings' => $request->servings, 'yield' => $request->yield, 'ingredients' => $request->ingredients, 'directions' => $request->directions, 'nutritionFacts' => $request->nutritionFacts, ]); // 修正跳转逻辑,传入当前创建的菜谱ID,修正成功提示 return redirect()->route('Recipes.show', $recipe->id)->with('success', '菜谱创建成功'); }
额外注意:你当前两张表的用户外键命名大小写不统一(thumbnails表是
user_id,recipes表是user_ID),同时表字段存在拼写错误(dsescription应为description、difficlty应为difficulty),如果项目还未正式上线,建议统一修正为Laravel约定的下划线小写命名,避免后续维护出现无意义的bug。
内容的提问来源于stack exchange,提问作者aalrashaid
相关产品推荐
相关产品推荐

