【问题标题】:Input Arrays should contain at least one value in Laravel Validation输入数组应至少包含一个 Laravel 验证中的值
【发布时间】:2021-08-24 16:41:17
【问题描述】:

我遇到了验证问题, 输入数组应至少包含一个值 例如,当我提交表单时,我得到以下输入

 array:26 [
  "_token" => "GMPKHos9nnC6zw6UGN4nFKVEGd5PoEpDe9lEPETw"
  "Customer" => "1"
  "Text_From_Date" => "07 Jun 2021"
  "From_Date" => "2021-06-07"
  "Text_Due_Date" => "16 Jun 2021"
  "Due_Date" => "2021-06-16"
  "Invoice_Id" => "INV-1"
  "Reference" => null
  "Branding" => null
  "Add_Currency" => null
  "Tax_Type" => "ex_tax"
  "Item" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Product_Description" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Quantity" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Unit_Price" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Discount" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Discount_Amount" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Account" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Tax_Rate" => array:5 [
    0 => "0"
    1 => "0"
    2 => "0"
    3 => "0"
    4 => "0"
  ]
  "Tax_Rate_Amount" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Region" => array:5 [
    0 => null
    1 => null
    2 => null
    3 => null
    4 => null
  ]
  "Amount" => array:5 [
    0 => "0"
    1 => "0"
    2 => "0"
    3 => "0"
    4 => "0"
  ]
  "Sub_Total" => "0"
  "Total_Discount" => "0"
  "Grand_Total" => "0"
  "Form_Type" => "1"
]

这是控制器中的验证规则

 public function save(Request $request)
    {
        $rules =  [
            'Customer' => 'required',
            'Text_From_Date' => 'required',
            'From_Date' => 'required|date',
            'Text_Due_Date' => 'required',
            'Due_Date' => 'required|date',
            'Reference' => 'bail|nullable|string|min:3',
            'Add_Currency' => 'bail|nullable',
            'Tax_Type' => 'required',
            'Product_Description.*' => 'exclude_if:Quantity.*,null|exclude_if:Unit_Price.*,null|required|max:1000',
            'Item.*' => 'exclude_if:Quantity.*,null|exclude_if:Unit_Price.*,null|bail|nullable',
            'Quantity.*' => 'exclude_if:Product_Description.*,null|required|numeric',
            'Unit_Price.*' => 'exclude_if:Product_Description.*,null|required|numeric',
            'Account.*' => 'exclude_if:Product_Description.*,null|required|numeric',
            'Amount.*' => 'exclude_if:Product_Description.*,null|required|numeric',
            'Sub_Total' => 'required|numeric',
            'Total_Discount' => 'required|numeric',

        ];
        $validator = Validator::make($request->all(), $rules);
        if ($validator->fails()) {
            return response()->json($validator->errors(), 422);
        } else {
            dd($validator->validated());
            return response()->json('saved', 200);
        }
    }

数组 Item , Product_Description, Unit_Price , Quantity , Discount , Discount_Amount , Discount_Amount , Account , Tax_Rate , Tax_Rate_Amount , Region , Amount 应该至少有一个 notNull 值。

请帮助解决问题提前谢谢!

【问题讨论】:

  • 你可以使用:"Product_Description.0" => "required",见:stackoverflow.com/a/57200746/10573560
  • @OMR 我认为这行不通,他将数组作为键对值传递,所以它会说元素存在,我之前遇到过类似的事情,我最终创建了一个自定义验证器,这将非常有用,因为这种情况会重复多次。
  • @OMR 我不想只填充第一个数组元素,其中任何可以填充的元素都将被排除在外。

标签: php laravel laravel-validation


【解决方案1】:

使用自定义验证规则,并制定该规则:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class NotEmptyArrayRule implements Rule
{

    private string $key;
    private string $value;

    public function passes($attribute, $value): bool
    {
        // remove null items from collection.
        $arr = collect($value)->filter(); 

        return $arr->isNotEmpty();
    }

    public function message(): string
    {
        return 'Input array is empty.';
    }
}

然后使用规则:

'Item' => [
  'exclude_if:Quantity.*,null',
  'exclude_if:Unit_Price.*,null',
  'bail',
  'nullable',
  new NotEmptyArrayRule(),
]

【讨论】:

    【解决方案2】:

    您可以使用自定义验证。您可以创建自定义规则以保持代码干净。这只是一个 sn-p

     'Quantity' =>['required',  function ($attribute, $value, $fail) {
    
                if (is_array($value)&&!array_filter($value)) {
                    $fail('The '.$attribute.' is invalid.');
                }
            },],
    

    例如,这里的数据包含数组中的所有空值所以抛出错误

    Array
    (
        [data] => Array
            (
                [0] => 
                [1] => 
            )
    
    )
    

    验证错误

    Illuminate\Support\MessageBag Object
    (
        [messages:protected] => Array
            (
                [data] => Array
                    (
                        [0] => The data is invalid.
                    )
    
            )
    
        [format:protected] => :message
    )
    

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多