在我的laravel POST端点中,我期望采用以下形式的“ items”参数:
$items => [
['item' => 'a', 'item_slot' => 1],
['item' => 'b', 'item_slot' => 2],
['item' => 'c', 'item_slot' => 3],
]
我想验证是否提供了所有必需的物品槽。
我有一组必需的插槽$requiredItemSlots = [1, 2]
我应使用哪些验证规则来确保存在$requiredItemSlots
中的项目位置?请注意,我不想将提供的插槽限制为所需的插槽,我只需要确保已填充所需的插槽即可。
现在我有类似的东西
'items.*.item' => 'required',
'items.*.item_slot' => 'required|distinct'
为确保没有传入重复的插槽。
最初我尝试做
'items.*.item_slot' => Rule::in($requiredItemSlots)
但这是不正确的,因为并非所有插槽都是必需的。
答案 0 :(得分:0)
您需要制作一个custom rule,类似这样:
'items' => [
'required',
'array',
function ($attribute, $value, $fail) {
$required = [1, 2];
// Cast to collection for easier checks
$items = collect($value);
foreach ($required as $r) {
if (! $items->firstWhere('item_slot', '=', $r)) {
$fail("$r has to be present in items.");
}
}
},
], // ..other validation rules
答案 1 :(得分:-1)
您可以结合使用distinct
,in:1,2,3
和size:3
来验证输入:
'items' => 'required|array|size:3',
'items.*.item_slot' => [
'required',
'distinct',
Rule::in($requiredSlots),
]
使用size:3
可以使数组具有完全3
个元素。使用distinct
可以确保item_slot
元素字段中没有重复项。并使用Rule::in($requiredSlots)
确保没有给定未知的item_slots
。