У меня есть массив элементов, отправленный контроллеру как 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);
})
],
Правило существует, если существует ключ массива, по которому выполняется его проверка, при условии, что этот ключ существует. Если я просто отправлю:
[{
"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"
]
]
если нет, то вам нужно изменить валидацию.
Дайте мне знать, если я не выполняю некоторые шаги, которые вы делаете.