Проверка массива в laravel требует наличия ключа. Удалить ключ и пропуски проверки - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть массив элементов, отправленный на контроллер в виде JSON в ключе формы элементов.

[{
    "sku": "w-hook-as1",
    "qty": 2,
    "cost_ex_tax": "34.22",
    "tax_rate": "0.2"
}]

Здесь он преобразуется в массив:

$request->merge(['items' => json_decode($request->items, true)]);

и проверено на соответствие правилу:

'items.*.sku' =>[
    'required',
    Rule::exists('products')->where(function ($query) {
        $query->where('company_id', Auth::user()->company_id);
    })
],

Существующее правило работает, если ключ массива, против которого его проверка существует, при условии, что ключ существует. Если я просто отправлю:

[{
    "qty": 2,
    "cost_ex_tax": "34.22",
    "tax_rate": "0.2"
}]

Затем проверка проходит.

Есть ли способ проверить, существует ли ключ, а также проверить его содержимое? Я ожидал бы, что необходимая проверка делает это, но это, кажется, не работает.

Как проверить массив в Laravel? - Этот ответ предлагает проверить, что это массив с x количеством элементов, но все еще не проверяет, какие именно ключи я ищу, там.

1 Ответ

0 голосов
/ 14 ноября 2018

Я пытался воспроизвести то, что у вас есть, без пользовательского правила, поэтому я сделал следующее:

у меня в клинке

<input type="text" name="items" value='[{"sku": "w-hook-as1","qty": 2,"cost_ex_tax": "34.22","tax_rate": "0.2"}, {"qty": 2,"cost_ex_tax": "34.22","tax_rate": "0.2"}]'>

Здесь вы можете заметить, что в моем втором объекте у меня нет элемента sku в объекте. Тогда в контроллере:

$arr = request()->merge(['items' => json_decode(request('items'), true)]);

$validator = Validator::make($arr->all(), [
   'items.*.sku' =>[
        'required'
    ]
]);

dd($validator->fails(), $validator);

А ответ следующий:

true // this is because the validation fails.
// and the message bag contains this
#messages: array:1 [▼
  "items.1.sku" => array:1 [▼
    0 => "The items.1.sku field is required."
  ]
]

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

Распечатайте $request->all() и убедитесь, что ваши элементы имеют следующее содержимое:

"items" => array:2 [▼
  0 => array:4 [▼
    "sku" => "w-hook-as1"
    "qty" => 2
    "cost_ex_tax" => "34.22"
    "tax_rate" => "0.2"
  ]
  1 => array:3 [▼
    "qty" => 2
    "cost_ex_tax" => "34.22"
    "tax_rate" => "0.2"
  ]
]

если нет, то вам нужно изменить проверку.

Дайте мне знать, если я не буду выполнять некоторые шаги, которые вы делаете.

...