У меня есть входящие почтовые данные из js, подобные этому
[form] => Array (
[name] => 'a form'
[type] => 'form'
...
[children] => Array (
[0] =>
[1] =>
[2] => Array(
[title] => 'first'
[order] => '1'
...
}
[3] => Array(
[title] => 'second'
[order] => '2'
...
)
...
)
...
)
и такие правила
[
'form.name' => 'required|string',
'form.type' => 'required|string',
...
'form.children.*.title' => 'requered|string'
'form.children.*.order' => 'requered|integer'
...
]
Каков наилучший способ полностью исключить/пропустить массивы form.children
, которые пусты, и обработать массивы с данными?
@MrEvers, к сожалению, они есть. Собственно, поэтому я и спрашивал.
Попробуй это:
[
'form.name' => 'required|string',
'form.type' => 'required|string',
...
'form.children.*.title' => 'sometimes|string'
'form.children.*.order' => 'sometimes|integer'
...
]
Sometimes
означает, что если есть что-то, следуйте следующему правилу (правилам).
https://laravel.com/docs/8.x/validation#validating-when-present
Добавление:
Для более сложных ситуаций, например. вас не интересует стоимость заказа, если нет названия, имеет смысл, верно? Попробуй это:
[
'form.name' => 'required|string',
'form.type' => 'required|string',
...
'form.children.*.title' => 'sometimes|string'
'form.children.*.order' => 'exclude_if:form.children.*.title,null|integer'
...
]
Я никогда не тестировал/использовал это на массивах.
Мне удалось полностью удалить пустые массивы, просто отфильтровав их из запроса с помощью метода laravel prepareForValidation() и array_filter(). Отлично сработало для меня.
protected function prepareForValidation()
{
$this->merge([
"form" => [
"children" => array_filter($this->form["children"])
]
]);
}
Ответ @DimitriMostrey тоже сработал. Его ответ — более короткое решение без дополнительного метода. Примет его ответ, чтобы любой, кто столкнулся с похожей ситуацией, мог выбрать тот, который подходит больше всего.
если они обнуляемые, они не требуются. заменить «требуемый» на «обнуляемый»