Laravel中使用单个表单向两张表插入数据及move()方法报错修复
问题原因
- 控制器逻辑错误:
$request->hasfile('image')返回的是布尔值,作用是判断是否上传了文件,你直接把这个布尔值赋值给了$image变量,后续调用$image->move()自然会报布尔类型无法调用成员方法的错误。 - 图片文件名生成逻辑错误:获取上传文件后缀的方式不对,直接拼接布尔值会得到完全错误的文件名。
- 图片存储值错误:创建RestoImage记录时直接传入了文件对象,实际应该存生成的文件名,前端才能正常读取展示。
- 模型关联方法缺失return:两个模型的关联方法都没有写return,后续需要调用关联查询时会无法正常获取关联数据。
修正后的代码
1. 控制器代码
public function store_resto(Request $request){ // 增加表单验证,避免脏数据入库 $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|email', 'address' => 'required|string', 'image' => 'required|image|max:2048' // 限制为常见图片格式,最大2M ]); $restaurant = new Restaurant(); $restaurant->name = $validated['name']; $restaurant->email = $validated['email']; $restaurant->address = $validated['address']; $restaurant->save(); // 修正图片处理逻辑 if ($request->hasFile('image')) { $image_file = $request->file('image'); // 获取文件真实后缀 $ext = $image_file->getClientOriginalExtension(); // 文件名加时间戳,避免随机数重复导致文件覆盖 $photo = rand(1,9999).time().'.'.$ext; $path = public_path().'/files/'; // 自动创建目录,避免目录不存在报错 if (!file_exists($path)) { mkdir($path, 0777, true); } $image_file->move($path, $photo); RestoImage::create([ 'image' => $photo, // 存储生成的文件名 'resto_id' => $restaurant->id, ]); } $request->session()->flash('status', 'Restaurant added successfully'); return redirect('list'); }
2. RestoImage模型修正
class RestoImage extends Model { use HasFactory; protected $fillable = ['image','resto_id']; // 关联方法补充return public function restaurant(){ return $this->belongsTo(Restaurant::class, 'resto_id'); } }
3. Restaurant模型修正
class Restaurant extends Model { use HasFactory; public $timestamps = false; public function menus(){ return $this->hasMany(Menu::class); } // 关联方法补充return public function restoimage(){ return $this->hasOne(RestoImage::class, 'resto_id'); } }
额外注意事项
请确保public/files目录存在,且对web服务器进程有写入权限,否则会出现文件写入失败的错误。
内容的提问来源于stack exchange,提问作者Neha_Soni
相关产品推荐
相关产品推荐

