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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:55:23