Laravel:如何验证所需的子数组项是否存在?

时间:2018-12-16 02:47:03

标签: php laravel laravel-5.7

在我的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)

但这是不正确的,因为并非所有插槽都是必需的。

2 个答案:

答案 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)

您可以结合使用distinctin:1,2,3size: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