Laravel 8更新表单仅修改单个字段报错 需全量更新才能运行如何解决
问题原因
- 你当前的
update方法将数据库更新操作和跳转返回都写在了if($image)的判断分支内,只有用户上传了新的产品图时才会执行更新和返回响应 - 当你仅修改文字类字段、不上传新图片时,
if($image)判断不成立,控制器方法没有返回任何响应,Laravel会默认触发GET请求的重定向,而你的更新路由仅支持POST方法,就会报The GET method is not supported for this route的错误 - 同时这种写法还会导致不上传新图时,你修改的文字字段根本不会被更新到数据库
修复方案
第一步:修改ProductController的update方法
将更新逻辑和返回响应从图片判断分支中移出来,调整后的代码如下:
public function update(Request $request, $id){ $oldlogo = $request->old_logo; $data = array(); $data['product_name'] = $request->product_name; $data['product_code'] = $request->product_code; $data['details'] = $request->details; $image = $request->file('logo'); if($image){ // 先判断旧文件是否存在再删除,避免报错 if(file_exists($oldlogo)){ unlink($oldlogo); } $image_name = date('dmy_H_s_i'); $ext = strtolower($image->getClientOriginalExtension()); $image_full_name = $image_name.'.'.$ext; $upload_path = 'public/media/'; $image_url = $upload_path.$image_full_name; $success = $image->move($upload_path,$image_full_name); $data['logo'] = $image_url; } // 无论是否上传新图,都执行更新操作 DB::table('products')->where('id',$id)->update($data); // 统一返回跳转响应 return redirect()->route('product.index')->with('success','Product Update Successfully'); }
第二步:可选优化(避免空值覆盖)
如果担心字段未填写导致空值写入数据库,可以给字段加验证规则,在方法最开头加入:
$request->validate([ 'product_name' => 'required|string|max:255', 'product_code' => 'required|string|max:255', 'details' => 'required|string', 'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048' ]);
内容的提问来源于stack exchange,提问作者firir
相关产品推荐
相关产品推荐

