Laravel 10中如何在ProductRequest复用ProductPriceRequest验证嵌套数据
在Laravel 10中复用请求验证类实现关联模型同时创建
步骤1:修改ProductRequest,复用ProductPriceRequest的验证规则
在app/Http/Requests/ProductRequest.php的rules()方法中,新增对product_prices数组的验证逻辑,并直接复用已有的ProductPriceRequest规则:
public function rules() { return [ // 保留原有的Product字段验证规则 'name' => 'required|string|max:255', 'description' => 'nullable|string', // 其他Product字段... // 新增关联价格的验证 'product_prices' => 'required|array|min:1', // 要求是数组且至少包含一个价格项 'product_prices.*' => app(ProductPriceRequest::class)->rules(), // 复用价格验证规则 ]; }
如果ProductPriceRequest有自定义错误消息,想要在数组验证中同步复用,可以在ProductRequest里添加messages()方法:
public function messages() { // 合并原有消息和价格请求的消息,给价格字段加上数组前缀 $baseMessages = parent::messages(); $priceMessages = app(ProductPriceRequest::class)->messages(); foreach ($priceMessages as $field => $message) { $baseMessages["product_prices.*.$field"] = $message; } return $baseMessages; }
步骤2:确保模型关联配置正确
在app/Models/Product.php中确认已定义与ProductPrice的一对多关联:
public function productPrices() { return $this->hasMany(ProductPrice::class); }
步骤3:修改控制器,同时创建主模型和关联模型
在ProductController的store方法中,先创建Product实例,再通过关联关系批量创建ProductPrice:
public function store(ProductRequest $request) { // 过滤掉product_prices字段,创建Product主模型 $product = Product::create($request->except('product_prices')); // 通过关联方法批量创建关联的ProductPrice $product->productPrices()->createMany($request->input('product_prices')); // 返回包含关联数据的响应 return response()->json($product->load('productPrices'), 201); }
请求数据示例
前端发起POST请求时,需传入包含Product字段和product_prices数组的JSON数据:
{ "name": "无线蓝牙耳机", "description": "续航24小时", "product_prices": [ { "price": 199.99, "currency": "CNY", "stock": 100 }, { "price": 29.99, "currency": "USD", "stock": 50 } ] }
注意事项
- 使用
app(ProductPriceRequest::class)而非直接new,是让Laravel容器处理请求类的依赖注入(比如ProductPriceRequest若用到Request实例或其他服务时,容器会自动解析)。 - 若
ProductPriceRequest包含authorize()权限验证逻辑,需注意该方法不会在复用规则时自动执行;如果需要验证价格项的创建权限,可将权限逻辑抽为独立方法,在ProductRequest中手动调用。
内容的提问来源于stack exchange,提问作者OaktreeDev
相关产品推荐
相关产品推荐

