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

Posted

技术标签:

【中文标题】Laravel 验证 - 数组字段,仅允许两个字段之一,但都不是必需的【英文标题】:Laravel Validation - Array fields, only one of two allowed but neither is required 【发布时间】:2018-11-29 18:38:57 【问题描述】:

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

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

所以,首先,因为neverExpiresnumberOfBillingCycles 都有值,所以它应该无法通过验证。第二个和第三个实例应该通过,因为它只包含 neverExpires 或不包含任何一个。

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

希望这有意义吗?提前干杯。

【问题讨论】:

您能向我们展示您的商店请求文件吗? @JoseSilva 我现在已经把它拆掉了,因为根本无法让它工作对不起。我已经尝试了所有require_withoutrequire_if 等,但它们似乎不允许我只确保完成其中一个或不允许完成任何一个。如果两者都存在并且有价值,我只希望它验证失败。 验证后你试过了吗?函数 withValidator() ? 你使用的是什么版本的 Laravel? @JoseSilva 感谢您抽出宝贵时间回复,但我选择了罗斯的解决方案,因为它满足了我的需求。 【参考方案1】:

只要您使用 >= 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');
                
            ,
        ],
    ];

【讨论】:

已排序!这工作得很好,谢谢!我把这个方法写进了它自己的自定义规则中,但是没有你的帮助是做不到的。

以上是关于Laravel 验证 - 数组字段,仅允许两个字段之一,但都不是必需的的主要内容,如果未能解决你的问题,请参考以下文章

jquery验证文本输入数组仅验证第一个字段[重复]

Laravel 验证仅在字段不为空时验证正则表达式

如何在 laravel 中输入所有数组并在字段下方显示验证错误

验证laravel 4错误中的数组表单字段

如果值存在于另一个字段数组中,Laravel 验证规则

Laravel 4 验证器 - 验证两个字段之一