Laravel验证-数组字段,仅允许两个字段之一,但两个字段都不是

时间:2018-06-20 15:06:42

标签: php laravel validation

我正在使用Laravel表单请求验证来验证对象数组,在每个对象中,我们有两个键neverExpiresnumberOfBillingCycles。这两个键都不是必需的,但是如果两个键都具有值,则验证将失败,因为我只想接受一个或另一个。

"addOns": {
    "add": [
        {
            "inheritedFromId": "EMEX1",
            "neverExpires": "false",
            "numberOfBillingCycles": "10"   
        },
        {
            "inheritedFromId": "EX1",
            "neverExpires": "true"
        },
        {
            "inheritedFromId": "EX2"
        }
    ]
},

因此,首先,由于neverExpiresnumberOfBillingCycles都具有值,因此它应该无法通过验证。第二个和第三个实例应该通过,因为它仅包含neverExpires或两者都不包含。

我尝试创建一个自定义验证器并将两个字段作为参数传递,例如addOns.add.*.neverExpiresaddOns.add.*.numberOfBillingCycles,但是问题是参数索引未设置并且我似乎找不到自定义规则中的数组索引,使我能够检查正确的数组对象值。

希望这有意义吗?提前加油。

1 个答案:

答案 0 :(得分:0)

只要使用> = Laravel 5.5,就可以验证add数组中的每个项目,而不是单个属性:

public function rules()
{
    return [
        'addOns.add.*' => [
            function ($attr, $value, $fail) {
                if (array_has($value, ['inheritedFromId', 'numberOfBillingCycles'])) {
                    $fail('You can not have both');
                }
            },
        ],
    ];
}
相关问题