我有一个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"
]
]
如果没有,则需要修改验证。
如果我没有按照你做的一些步骤,请告诉我。