簡體   English   中英

輸入 Arrays 應包含 Laravel 驗證中的至少一個值

[英]Input Arrays should contain at least one value in Laravel Validation

我在驗證時遇到問題,輸入 arrays 應至少包含一個值,例如,當我提交表單時,我得到以下輸入

 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"
]

這是 controller 中的驗證規則

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

arrays Item, Product_Description, Unit_Price, Quantity, Discount, Discount_Amount, Discount_Amount, Account, Tax_Rate, Tax_Rate_Amount, Region, Amount 應該至少有一個 notNull 值。

請幫助解決問題在此先感謝!

您可以使用自定義驗證。您可以創建自定義規則以保持代碼干凈。這只是一個片段

 'Quantity' =>['required',  function ($attribute, $value, $fail) {

            if (is_array($value)&&!array_filter($value)) {
                $fail('The '.$attribute.' is invalid.');
            }
        },],

例如,這里的數據包含數組中的所有 null 值所以拋出錯誤

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

)

驗證錯誤

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

        )

    [format:protected] => :message
)

使用自定義驗證規則,並制定該規則:

<?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(),
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM