У меня есть форма, которая отправляет поле structure
в виде массива.Массив structure
содержит определения столбцов таблицы базы данных.
$validator = Validator::make($request->all(), [
'structure' => 'required|array|min:1',
'structure.*.name' => 'required|regex:/^[a-z]+[a-z0-9_]+$/',
'structure.*.type' => 'required|in:integer,decimal,string,text,date,datetime',
'structure.*.length' => 'nullable|numeric|required_if:structure.*.type,decimal',
'structure.*.default' => '',
'structure.*.index' => 'required_if:is_auto_increment,false|boolean',
'structure.*.is_nullable' => 'required_if:is_auto_increment,false|boolean',
'structure.*.is_primary' => 'required_if:is_auto_increment,false|boolean',
'structure.*.is_auto_increment' => 'required_if:structure.type,integer|boolean',
'structure.*.is_unique' => 'required_if:is_auto_increment,false|boolean',
'structure.*.decimal' => 'nullable|numeric|required_if:structure.*.type,decimal|lt:structure.*.length',
]);
Не вдаваясь в объяснение всех правил, следует убедиться, что поле length
всегда равно null
, когда type
не является string
или decimal
, поскольку вы не можете назначить длину столбцам, отличным от этих типов.Итак, я пытаюсь использовать метод sometimes
в экземпляре $validator
.
$validator->sometimes('structure.*.length', 'in:null', function ($input) {
// how to access the structure type here?
});
Мой вопрос находится в закрытии, как мне убедиться, что length
только null
для элемента массива, для которого type
имеет значение, отличное от string
или decimal
.
Я пробовал функцию dd
, и кажется, что весь входной массив передается в замыкание.
$validator->sometimes('structure.*.length', 'in:null', function ($input) {
dd($input);
});
Вот результат метода dd
.
dd method">
Я могу использовать конструкцию foreach
, но это не такне быть ли это неэффективным?Проверка всех элементов для одного элемента?
Как проверить тип только для рассматриваемого элемента массива?
Существует ли способ Laravel для этого?