验证整数数组

时间:2017-03-08 03:43:16

标签: laravel laravel-5 laravel-5.3

给定一个整数数组:

[1, 2, 3, 4, ...]

如何使用验证器检查表中是否存在这些验证器?可能没有foreach循环?

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

3 个答案:

答案 0 :(得分:13)

您的书面验证应该有效。如果存在验证与数组一起使用,它将自动使用where in作为存在查询。

因此,根据您编写的验证,验证将获得users记录的计数,其中id字段位于array输入提供的ID列表中

因此,如果您的array[1, 2, 3, 4],它将获得users.id in (1,2,3,4)的计数,并将其与array数组中的元素计数进行比较(是4)。如果查询计数是> =数组计数,则验证通过。

这里要注意两件事:如果您检查的列不是唯一的,或者您的数组数据有重复的元素。

如果您检查的列不是唯一的,则您的查询计数可能是> =数组计数,但并非所有数组中的ID都存在。如果您的数组是[1, 2, 3, 4],但您的表有四个ID为1的记录,即使具有ID 2,3和4的记录不存在,验证也会通过。

对于重复的数组值,如果您的数组为[1, 1],但您只有一条id为1的记录,则验证将失败,因为查询计数将为1,但您的数组计数为2。

要解决这两个问题,您可以进行单独的数组元素验证。您的规则类似于:

$request = [
    'ids' => [1, 2, 3, 4],
];

$rules = [
    'ids' => 'required|array',
    'ids.*' => 'exists:users,id', // check each item in the array
];

$validator = Validator::make($request, $rules);

dd($validator->passes(), $validator->messages()->toArray());

请记住,每个元素都将单独验证,因此它将为ids数组中的每个元素运行一个新查询。

答案 1 :(得分:1)

您可以制作custom rule

public function validateArrayInt($attribute, $value, $parameters){  
    return array_filter(value, 'is_int')
}

然后:

$validator = Validator::make($request->all(), [
    'array' => ['required', 'array_int', 'exists:users,id']
]);

答案 2 :(得分:0)

尝试此操作以检查您的响应数组是否为json。

return response()->json($yourArr)->setEncodingOptions(JSON_NUMERIC_CHECK);