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

Laravel报错:category_slug不可为null,如何从分类表获取该字段?

问题根源

报错是因为你直接用$request->category_slug填充字段,但前端未传递该参数,导致值为null,违反了数据库category_slug字段的非空约束。正确做法是通过关联的分类表,根据category_id自动获取对应的slug,而非依赖请求参数。

解决方案

1. 修正模型关联关系

Product模型中,商品属于分类,应使用belongsTo而非hasOne(hasOne是一对一中的"一"端,这里分类是"一",商品是"多"):

class Product extends Model
{
    use HasFactory;

    public function category()
    {
        return $this->belongsTo(Category::class, 'category_id');
    }
}

2. 直接在控制器中获取分类slug(快速修复)

修改update方法,通过category_id查询分类表获取slug,替换从请求中取值的逻辑:

public function update(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:190',
        'price' => 'required',
        'category_id' => 'required|exists:categories,id', // 新增验证,确保category_id有效
    ])->validate();

    $product = Product::findOrFail($request->id); // 用findOrFail替代find,找不到商品时返回404
    $product->name = $request->name;
    $product->price = $request->price;
    $product->category_id = $request->category_id;
    
    // 通过分类ID获取对应的slug
    $category = Category::find($request->category_id);
    $product->category_slug = $category->slug;
    
    $product->update();

    return redirect()->back()->with('success', __('Product has been updated'));
}

3. 用模型事件自动同步slug(更优雅的方案)

在Product模型中添加saving事件,无论新增还是更新商品,只要category_id变更,自动同步category_slug,无需在控制器中重复编写逻辑:

模型代码:

class Product extends Model
{
    use HasFactory;

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    protected static function boot()
    {
        parent::boot();

        // 保存商品前自动同步分类slug
        static::saving(function ($product) {
            if ($product->category_id) {
                $product->category_slug = $product->category->slug;
            }
        });
    }
}

简化后的控制器代码:

public function update(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:190',
        'price' => 'required',
        'category_id' => 'required|exists:categories,id',
    ])->validate();

    $product = Product::findOrFail($request->id);
    // 直接填充请求中的字段,slug由模型事件自动处理
    $product->fill($request->only(['name', 'price', 'category_id']))->update();

    return redirect()->back()->with('success', __('Product has been updated'));
}

内容的提问来源于stack exchange,提问作者user20817013

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:55:22