5

我的表单多次具有相同的输入字段。我的表单字段如下:

<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'
    ]);

这没用。我尝试了大小、必需、可为空的组合。没有任何效果。

4

6 回答 6

7

事实上,使用它就足够了:

$validator = Validator::make($request->all(),[
        'items' => 'required|array'
    ]);

所做的更改:

  • 使用items代替items.*- 你想设置一般项目的规则,如果你使用items.*它意味着你将规则分别应用于数组的每个发送元素
  • 删除size:1,因为这意味着您只想发送一个元素(并且您至少想要一个)。你根本不需要它,因为你有required规则。您可以阅读所需规则的文档,并且可以在其中阅读空数组会导致该required规则失败,因此该required数组规则使该数组应至少具有 1 个元素,因此您不需要min:1size:1根本不需要
于 2018-09-19T21:54:30.383 回答
3

您可以像这样检查它:

$validator = Validator::make($request->all(), [
    "items"    => "required|array|min:1",
    "items.*"  => "required|string|distinct|min:1",
]);

在上面的例子中:

  • “items”必须是一个至少包含 1 个元素的数组。
  • “items”数组中的值必须是不同的(唯一的)字符串,长度至少为 1 个字符。
于 2018-09-19T11:28:17.873 回答
1

您可以使用带有闭包的自定义规则。

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.');
         } 
       },
     ]
   ]);

这将设置错误消息:“项目为空。”

于 2018-09-19T14:10:48.157 回答
1

知道您使用的是最新版本的 Laravel,我真的建议您查看表单请求功能。这样,您就可以将验证与控制器分离,从而使其更加干净。

无论如何,正如我上面的答案所建议的那样,你应该足够了:

'items' => 'required|array'
于 2018-09-19T22:00:40.327 回答
0

你应该试试这个:

$validator = $request->validate([
    "items"    => "required|array|min:3",
    "items.*"  => "required|string|distinct|min:3",
]);
于 2018-09-19T11:37:27.670 回答
0

像往常一样正常做:

 $validator = Validator::make($request->all(),[
    'items' => 'required'
  ]);
于 2018-09-19T11:24:08.810 回答