验证laravel中的数组需要密钥存在.移除密钥和验证通行证



我有一个items数组,在items表单键中作为JSON发送到控制器。

[{
    "sku": "w-hook-as1",
    "qty": 2,
    "cost_ex_tax": "34.22",
    "tax_rate": "0.2"
}]

在这里它被转换成一个数组:

$request->merge(['items' => json_decode($request->items, true)]);

并根据规则进行验证:

'items.*.sku' =>[
    'required',
    Rule::exists('products')->where(function ($query) {
        $query->where('company_id', Auth::user()->company_id);
    })
],

如果验证所依据的数组键存在,则exists规则确实有效,假设该键存在。如果我只是发送:

[{
    "qty": 2,
    "cost_ex_tax": "34.22",
    "tax_rate": "0.2"
}]

然后验证通过。

有没有一种方法可以检查密钥是否存在以及验证其内容?我本以为所需的检查能做到这一点,但它似乎不起作用。

如何在Laravel中验证数组?-这个答案建议验证它是一个包含x个元素的数组,但仍然没有检查我要查找的确切密钥是否存在。

我试图在没有自定义规则的情况下复制您所拥有的内容,因此我所做的如下:

我的刀片上有

<input type="text" name="items" value='[{"sku": "w-hook-as1","qty": 2,"cost_ex_tax": "34.22","tax_rate": "0.2"}, {"qty": 2,"cost_ex_tax": "34.22","tax_rate": "0.2"}]'>

您可以在这里注意到,在我的第二个对象中,对象中没有sku项。然后在控制器中:

$arr = request()->merge(['items' => json_decode(request('items'), true)]);
$validator = Validator::make($arr->all(), [
   'items.*.sku' =>[
        'required'
    ]
]);
dd($validator->fails(), $validator);

响应如下:

true // this is because the validation fails.
// and the message bag contains this
#messages: array:1 [▼
  "items.1.sku" => array:1 [▼
    0 => "The items.1.sku field is required."
  ]
]

所以要确保你没有做错什么。

打印出$request->all(),并确保您的物品具有以下内容:

"items" => array:2 [▼
  0 => array:4 [▼
    "sku" => "w-hook-as1"
    "qty" => 2
    "cost_ex_tax" => "34.22"
    "tax_rate" => "0.2"
  ]
  1 => array:3 [▼
    "qty" => 2
    "cost_ex_tax" => "34.22"
    "tax_rate" => "0.2"
  ]
]

如果没有,则需要修改验证。

如果我没有按照你做的一些步骤,请告诉我。

最新更新