You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:39:01