0

我想在值为 1 且字段值为 1 时进行start_po_no验证(required_ifdigits_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 验证文档,但我不是用户如何正确检查它。

#编辑

但是,digits_between验证仍然检查是否use_spopo_type1。我还想digits_between验证何时use_spopo_type等于 1。

4

2 回答 2

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;
}
于 2021-02-04T06:04:43.040 回答
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.');
                }
            }
        ]
    ];

使用添加()

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

$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
}
于 2021-02-04T06:04:34.563 回答