基于其他字段的 Laravel 检查验证

时间:2021-02-04 04:21:17

标签: laravel validation

我想在 start_po_no 值为 1 且 required_if 字段值为 1 时进行 digits_between 验证(po_typeuse_spo)。 现在,我在请求文件中编写了验证规则,如下所示:

public function rules()
{
    return [
        'use_spo' => 'required',
        'po_type' => 'required',
        'start_po_no' => Rule::requiredIf(function () use ($supplierPoUse, $generatePo) {
            return request("use_spo") == 1 && request("po_type") == 1;
        }).'|digits_between:1,9',
    ];
}

但是,此代码仅适用于 required_if,但 digits_between 仍然无效。我阅读了 laravel 验证文档,但我不是用户如何正确检查它。

#Edit

但是,digits_between 验证仍然检查即使 use_spopo_type 不是 1。我还想要 digits_betweenuse_spo 时的 po_type 验证等于 1。

2 个答案:

答案 0 :(得分:3)

根据解释,我相信您可以有条件地添加规则。没有理由让它变得更复杂。

public function rules()
{
    $rules = [
        'use_spo' => 'required',
        'po_type' => 'required',
    ];

    if (request("use_spo") == 1 && request("po_type") == 1) {
        $rules['start_po_no'] = 'required|digits_between:1,9';
    }

    return $rules;
}

答案 1 :(得分:0)

我有两种方法

使用闭包

return [
        'use_spo' => 'required',
        'po_type' => 'required',
        'start_po_no' => [
            Rule::requiredIf(function () use ($supplierPoUse, $generatePo) {
                return request("use_spo") == 1 && request("po_type") == 1;
            }),
            function ($attribute, $value, $fail) {
                if (request("use_spo") == 1 && request("po_type") == 1) {
                    if(!(1 <= $value && $value <= 9))
                        $fail('The '.$attribute.' is invalid.');
                }
            }
        ]
    ];

使用 add()

不要在之后使用数字,而是在验证规则运行后使用。 您可以在初始验证后添加验证。

$validator = Validator::make(...);

$validator->after(function ($validator) {
    if (request("use_spo") == 1 && request("po_type") == 1) {
        if(!(1 <= $value && $value <= 9))
            $validator->errors()->add(
                'start_po_no', 'invalid start po no'
            );
        }
});

if ($validator->fails()) {
    // throw your validation exception
}