【问题标题】:Laravel check validation based on another fields基于其他字段的 Laravel 检查验证
【发布时间】:2021-02-04 04:21:17
【问题描述】:

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

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_type 不是 1。当 use_spopo_type 等于 1 时,我还想要 digits_between 验证。

【问题讨论】:

    标签: laravel validation


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

    • 更好更简单
    • 最好的方法 :) 谢谢
    【解决方案2】:

    我有两种方法

    使用闭包

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 2018-01-12
      • 1970-01-01
      • 2017-09-08
      • 2023-03-10
      • 2015-07-24
      • 2020-07-14
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多