Laravel验证数组中至少需要一个元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel验证数组中至少需要一个元素相关的知识,希望对你有一定的参考价值。

我试图将以下数据发布到在Laravel上构建的端点。

{
  "category": "2",
  "title": "my text goes here",
  "difficulty": 1,
  "correct": {
    "id": "NULL",
    "text": "Correct"
  },
  "wrong": [
    {
      "id": "NULL",
      "text": ""
    },
    {
      "id": "NULL",
      "text": ""
    },
    {
      "id": "NULL",
      "text": ""
    }
  ]
}

我有以下验证规则。

return [
    'correct'      => 'required|array',
    'correct.text' => 'required',
    'wrong'        => 'required|array|between:1,3'
];

我想要完成的是wrong应该是和数组,它应该包含至少一个元素,不应该超过3.现在这些规则是令人满意的,但还有一个案例我需要注意,这是验证在textwrong。根据现行规则,如果我发布上述数据,它将接受,因为text部分中的wrong没有适用的规则。我需要添加哪条规则来验证wrong部分至少包含一个非空文本的条目。

答案

tl;博士

如果您对验证器规则有非常具体的需求,您可以随时使用create your own

创建自定义验证器

该计划将是:properties_filled:propertyName:minimumOccurence。此规则将检查验证字段是否:

  • 是一个数组。
  • 它的元素在称为minimumOccurence的元素属性中至少有!== ''量的非空(propertyName)值。

app/Providers/AppServiceProvider.php文件的boot方法中,您可以添加自定义规则实现:

public function boot()
{
    Validator::extend('properties_filled', function ($attribute, $value, $parameters, $validator) {
        $validatedProperty = $parameters[0];
        $minimumOccurrence = $parameters[1];

        if (is_array($value)) {
            $validElementCount = 0;
            $valueCount = count($value);
            for ($i = 0; $i < $valueCount; ++$i) {
                if ($value[$i][$validatedProperty] !== '') {
                    ++$validElementCount;
                }
            }
        } else {
            return false;
        }

        return $validElementCount >= $minimumOccurrence;
    });
}

然后您可以在验证中使用它,如下所示:

return [
    'correct'      => 'required|array',
    'correct.text' => 'required',
    'wrong'        => 'required|between:1,3|properties_filled:text,1'
];

测试

注意:我假设您使用json_decode$assoc参数设置为true来解析您的JSON数据。如果使用对象,则将条件中的$value[$i][$validatedProperty] !== ''更改为:$value[$i]->{$validatedProperty} !== ''

这是我的示例测试:

$data = json_decode('{"category":"2","title":"mytextgoeshere","difficulty":1,"correct":{"id":"NULL","text":"Correct"},"wrong":[{"id":"NULL","text":""},{"id":"NULL","text":""},{"id":"NULL","text":""}]}', true);
$validator = Validator::make($data, [
    'correct'      => 'required|array',
    'correct.text' => 'required',
    'wrong'        => 'required|between:1,3|properties_filled:text,1'
]);
$validator->fails();
另一答案

利用validation rule in

编辑:我认为错误将具有特定值,因此以这种方式传递该值

return [
    'correct'      => 'required|array',
    'correct.text' => 'required',
    'wrong'        => 'required|array|between:1,3',
    'wrong.text'   => 'sometimes|min:1|in:somevalue,someothervalue',
];

sometimes验证确保仅在存在的情况下检查字段。要检查是否至少会有

我不确定,但min是否足以满足您的要求?否则,您必须按照其他人的建议编写自定义验证规则

另一答案

如果要验证数组中的输入字段,可以像这样定义规则:

return [
    'correct'      => 'required|array',
    'correct.text' => 'required',
    'wrong'        => 'required|array|between:1,3',
    'wrong.*.text' => 'required|string|min:1',
];

以上是关于Laravel验证数组中至少需要一个元素的主要内容,如果未能解决你的问题,请参考以下文章

如果存在数组,则需要 Laravel 验证数组元素

Laravel 查询以获得具有至少一个数组元素的结果?

Laravel 填充数组元素的验证规则

Laravel“至少一个”字段需要验证

Laravel 5 - 根据需要验证数组,但允许传递一个空数组

Laravel 验证检查数组大小的最小值和最大值