给定一个整数数组:

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

如何使用验证器检查表中是否每个都存在?没有foreach循环可能吗?
$validator = Validator::make($request->all(), [
    'array' => 'required|exists:users,id'
]);

最佳答案

您的书面验证应有效。如果将现存验证与数组一起使用,它将对现存查询自动使用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数组中的每个元素运行一个新查询。

关于laravel - 验证整数数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42662579/

10-12 14:26
查看更多