Laravel创建模型时如何结合请求验证传入额外字段?
解决方案
你可以通过合并验证后的请求字段与额外字段的方式,把user_id和status_id传入模型创建方法,以下是几种常用的实现方式:
方法1:合并数组后创建(最直接)
先获取验证后的字段数组,再将额外字段追加进去,最后调用create方法:
public function store(StoreAdvertisementRequest $request): RedirectResponse { $validated = $request->validated(); $validated['user_id'] = Auth::id(); $validated['status_id'] = AdvertisementStatus::WAITING_FOR_PROPOSAL; $advertisement = Advertisement::create($validated); // 后续逻辑,比如跳转等 return redirect()->route('advertisements.show', $advertisement); }
方法2:分步填充与保存
如果需要对模型做更多额外操作,可以先实例化模型,填充验证字段后再手动赋值额外属性,最后保存:
public function store(StoreAdvertisementRequest $request): RedirectResponse { $advertisement = new Advertisement(); $advertisement->fill($request->validated()); $advertisement->user_id = Auth::id(); $advertisement->status_id = AdvertisementStatus::WAITING_FOR_PROPOSAL; $advertisement->save(); // 后续逻辑 return redirect()->route('advertisements.show', $advertisement); }
方法3:在请求类中追加字段(适合全局复用场景)
如果这两个字段在多个地方都需要添加,可以在StoreAdvertisementRequest类中重写validated方法,自动追加字段:
// app/Http/Requests/StoreAdvertisementRequest.php public function validated() { $validated = parent::validated(); $validated['user_id'] = Auth::id(); $validated['status_id'] = AdvertisementStatus::WAITING_FOR_PROPOSAL; return $validated; }
之后控制器里直接使用$request->validated()就包含了这两个字段:
public function store(StoreAdvertisementRequest $request): RedirectResponse { $advertisement = Advertisement::create($request->validated()); // 后续逻辑 return redirect()->route('advertisements.show', $advertisement); }
重要提醒
确保你的Advertisement模型已经将user_id和status_id添加到$fillable属性中,否则会触发Laravel的批量赋值保护错误:
// app/Models/Advertisement.php protected $fillable = [ // 其他允许批量赋值的字段 'user_id', 'status_id', ];
内容的提问来源于stack exchange,提问作者Floris
相关产品推荐
相关产品推荐

