代码之家  ›  专栏  ›  技术社区  ›  indieman

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

  •  2
  • indieman  · 技术社区  · 7 年前

    在my 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 回复  |  直到 7 年前
        1
  •  0
  •   DevK    7 年前

    你需要做一个决定 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
    
        2
  •  -1
  •   Namoshek    7 年前

    您可以使用以下选项的组合: distinct , in:1,2,3 size:3 要验证输入,请执行以下操作:

    'items' => 'required|array|size:3',
    'items.*.item_slot' => [
        'required',
        'distinct',
        Rule::in($requiredSlots),
    ]
    

    具有 尺码:3 您强制数组具有精确的 3 元素。具有 不同的 item_slot 元素字段。和 Rule::in($requiredSlots) item_slots 鉴于

    推荐文章