Laravel自定义验证规则校验多值输入数组时失效如何解决
问题根因
你自定义验证器的passes方法存在逻辑错误:foreach循环第一次迭代就直接返回了校验结果,仅验证了第一个标题,后续所有提交的标题都不会进入校验流程,这就是批量添加时验证失效的核心原因。
除此之外,现有逻辑还遗漏了本次提交的多个标题之间的重复校验:如果用户同时提交两个完全相同的新标题,即使数据库中没有对应记录,也会出现重复入库的问题。
修正后的验证器代码
<?php namespace App\Rules; use App\Models\QueryManagement\CategoryResolver as Category; // 补充别名,避免类找不到报错 use Illuminate\Contracts\Validation\Rule; class CategoryTitle implements Rule { /** * 新建规则实例 * * @return void */ public function __construct() { // } /** * 判断验证规则是否通过 * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { // 第一步:校验本次提交的标题自身是否重复 if (count($value) !== count(array_unique($value))) { return false; } // 第二步:逐个校验标题在对应分类下是否已存在于数据库 foreach ($value as $element) { if (Category::whereDepartmentId(request('department'))->whereName($element)->exists()) { return false; } } // 所有校验都通过才返回成功 return true; } /** * 获取验证错误信息 * * @return string */ public function message() { return '同一分类下的标题必须唯一'; } }
配套验证规则调用
在控制器的验证逻辑中,建议补充数组元素的基础校验,完整规则参考:
$validated = $request->validate([ 'department' => 'required|exists:departments,id', 'names' => ['required', 'array', 'min:1', new CategoryTitle()], 'names.*' => ['required', 'string', 'max:255'], // 每个标题的基础格式校验 ]);
内容的提问来源于stack exchange,提问作者zobay
相关产品推荐
相关产品推荐

