You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');
}

额外优化点

  1. 路由模型绑定简化:你的路由已经使用了Route::put('/category/{category}', 'update');,可以直接在控制器方法参数里注入Category模型,无需手动调用findOrFail:
public function update(CategoryFormRequest $request, Category $category){
    // $category已经是数据库中对应的实例,无需再查询
    $validatedData = $request->validated();
    // ...后续代码不变
}
  1. 状态逻辑校验:$request->status == true ? '0':'1'的逻辑看起来与常规认知相反(通常复选框选中对应启用状态1),如果不是特殊业务需求,建议调整为$request->status == true ? '1':'0'。

内容的提问来源于stack exchange,提问作者MD Sayful Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:01:05