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
相关产品推荐
相关产品推荐

