Через «крапкову» нотацію й зірочку, яка означає кожен елемент масиву.
$request->validate([
'items' => ['required', 'array', 'min:1', 'max:50'],
'items.*.product_id' => ['required', 'integer', 'distinct', 'exists:products,id'],
'items.*.quantity' => ['required', 'integer', 'min:1'],
'tags' => ['array'],
'tags.*' => ['string', 'max:30'],
]);
На що звернути увагу:
- Перевіряйте сам масив (
array,max), а не лише елементи. Без обмеження клієнт надішле 10 000 елементів, і для кожного виконаються запитиexists. distinctзабороняє повтори - той самий товар двічі в одному замовленні.existsна кожен елемент - окремий запит до бази. Для великих масивів краще перевірити всі ID одним запитом уafter().- Повідомлення можуть містити позицію елемента:
:index(з нуля) чи:position(з одиниці) - «Товар #3: кількість має бути не менше 1».
validated() поверне лише ті ключі елементів, для яких є правила, тож зайві поля всередині елементів масиву теж відкинуться.