Моя форма имеет одно и то же поле ввода несколько раз. Мое поле формы выглядит следующим образом:
<input type='text' name='items[]'>
<input type='text' name='items[]'>
<input type='text' name='items[]'>
И запрос содержит ($ request [‘items’):
array:1 [▼
"items" => array:3 [▼
0 => "item one"1 => "item two"2 => "item three"]
]
Я хочу, чтобы хотя бы один из пунктов был заполнен. Моя текущая проверка в контроллере
$validator = Validator::make($request->all(),[
'items.*' => 'required|array|size:1'
]);
Это не работает. Я пытался с комбинацией размера, требуется, обнуляемый. Ничего не работает
Просто сделайте это как обычно:
$validator = Validator::make($request->all(),[
'items' => 'required'
]);
Вы можете проверить это так:
$validator = Validator::make($request->all(), [
"items" => "required|array|min:1",
"items.*" => "required|string|distinct|min:1",
]);
В приведенном выше примере:
Вы должны попробовать это:
$validator = $request->validate([
"items" => "required|array|min:3",
"items.*" => "required|string|distinct|min:3",
]);
Вы можете использовать пользовательское правило с закрытием.
https://laravel.com/docs/5.7/validation#custom-validation-rules
Чтобы проверить, имеет ли массив все нулевые значения, проверьте его с помощью array_filter, который возвращает false, если все они нулевые.
Так что-то вроде …
$request->validate([
'items' => [
// $attribute = 'items', $value = items array, $fail = error message as string
function($attribute, $value, $fail) {
if (!array_filter($value)) {
$fail($attribute.' is empty.');
}
},
]
]);
Это установит сообщение об ошибке: ‘items is empty. «
На самом деле, достаточно использовать:
$validator = Validator::make($request->all(),[
'items' => 'required|array'
]);
Изменения сделаны:
items
вместо items.*
— вы хотите установить правило общих предметов, если вы используете items.*
это означает, что вы применяете правило к каждому отправляемому элементу массива отдельноsize:1
потому что это будет означать, что вы хотите отправить ровно один элемент (и вам нужен хотя бы один). Вам это вообще не нужно, потому что у вас есть required
править. Ты можешь читать документация для требуемого правила и вы можете прочитать там, что пустой массив будет required
Правило потерпит неудачу, так что это required
Правило для массива делает этот массив должен иметь как минимум 1 элемент, так что вам не нужно min:1
или же size:1
совсемЗная, что вы используете последнюю версию Laravel, я действительно рекомендую изучить Функция запроса формы. Таким образом, вы можете отделить проверку от вашего контроллера, сохраняя его намного чище.
В любом случае, как подсказал мне ответ выше, для вас должно быть достаточно:
'items' => 'required|array'