Как пропустить проверку для пустого массива?

У меня есть входящие почтовые данные из 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 12.12.2020 10:17

@MrEvers, к сожалению, они есть. Собственно, поэтому я и спрашивал.

Skeletor 12.12.2020 10:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
248
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуй это:

[
    '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 тоже сработал. Его ответ — более короткое решение без дополнительного метода. Примет его ответ, чтобы любой, кто столкнулся с похожей ситуацией, мог выбрать тот, который подходит больше всего.

Другие вопросы по теме