Laravel: как проверить наличие необходимых элементов подмассива? - PullRequest
0 голосов
/ 16 декабря 2018

В моей конечной точке POST laravel, я ожидаю параметр "items" в следующей форме:

$items => [
  ['item' => 'a', 'item_slot' => 1],
  ['item' => 'b', 'item_slot' => 2],
  ['item' => 'c', 'item_slot' => 3],
]

Я хочу проверить, что все необходимые слоты предметов были предоставлены.

Iиметь массив обязательных слотов $requiredItemSlots = [1, 2]

Какие правила проверки я должен использовать, чтобы убедиться, что слоты элементов в $requiredItemSlots присутствуют?Обратите внимание, я не хочу ограничивать предоставленные слоты требуемыми, мне просто нужно убедиться, что необходимые слоты заполнены.

На данный момент у меня есть что-то вроде:

'items.*.item' => 'required',
'items.*.item_slot' => 'required|distinct'

Чтобы убедиться, что дублирующие слоты не были переданы.

Первоначально я пытался сделать

'items.*.item_slot' => Rule::in($requiredItemSlots)

Но это не правильно, потому что не все слоты обязательно требуются.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Вы можете использовать комбинацию 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.

0 голосов
/ 16 декабря 2018

Вам нужно будет создать пользовательское правило , что-то вроде этого:

'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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...