Laravel 9 分类信息更新后数据库未同步问题求助
问题分析与解决方案
核心问题
你在控制器的update方法里犯了一个关键错误:已经通过Category::findOrFail($category)获取了数据库中对应的分类模型实例,但随后又用$category = new Category;创建了一个全新的未关联数据库记录的模型对象,覆盖了之前的实例。
当你对这个新创建的模型调用update()时,由于它没有主键(id字段为空),Eloquent不会执行数据库更新操作,只会修改内存中的对象属性——这就是为什么返回的对象有更新后的数据,但数据库里没变化的原因。
修复后的控制器代码
public function update(CategoryFormRequest $request, $category){ // 获取数据库中对应的分类实例,不要覆盖这个变量 $category = Category::findOrFail($category); $validatedData = $request->validated(); // 直接修改已获取的模型属性,不要新建Category实例 $category->name = $validatedData['name']; $category->slug = Str::slug($validatedData['slug']); $category->description = $validatedData['description']; if($request->hasFile('image')){ // 使用原模型的image字段值拼接路径,删除旧文件 $path = 'uploads/category/' . $category->image; if(File::exists($path)){ File::delete($path); } $file = $request->file('image'); $ext = $file->getClientOriginalExtension(); $fileName = 'PC' .'-'. time() .'.'. $ext; $file->move('uploads/category/', $fileName); $category->image = $fileName; } $category->meta_title = $validatedData['meta_title']; $category->meta_keywords = $validatedData['meta_keywords']; $category->meta_description = $validatedData['meta_description']; $category->status = $request->status == true ? '0':'1'; // 调用save()提交修改到数据库,比update()更直观 $category->save(); // 原代码中return $category会提前终止方法,调整顺序确保跳转执行 return redirect('admin/category')->with('message','Category Updated Successfully'); }
额外优化点
- 路由模型绑定简化:你的路由已经使用了
Route::put('/category/{category}', 'update');,可以直接在控制器方法参数里注入Category模型,无需手动调用findOrFail:
public function update(CategoryFormRequest $request, Category $category){ // $category已经是数据库中对应的实例,无需再查询 $validatedData = $request->validated(); // ...后续代码不变 }
- 状态逻辑校验:
$request->status == true ? '0':'1'的逻辑看起来与常规认知相反(通常复选框选中对应启用状态1),如果不是特殊业务需求,建议调整为$request->status == true ? '1':'0'。
内容的提问来源于stack exchange,提问作者MD Sayful Islam
相关产品推荐
相关产品推荐

