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

如何实现Laravel中services表name与department_id双字段组合唯一性校验

组合唯一性校验实现方案

1. 数据库层添加唯一索引(底层强制校验,避免并发场景绕过应用层校验)

这是必须的底层保障,直接创建迁移文件执行以下逻辑即可:

Schema::table('services', function (Blueprint $table) {
    $table->unique(['name', 'department_id']);
});

如果需要自定义索引名,可以传入第二个参数:$table->unique(['name', 'department_id'], 'uk_services_name_dept');

2. 修正应用层ServiceRequest校验规则

你原来的unique写法不符合Laravel语法规范,调整为以下兼容创建、更新双场景的规则即可:
首先需要在请求类顶部引入Rule门面:

use Illuminate\Validation\Rule;

然后修改校验规则代码:

return [
    'params.name' => [
        'required',
        'string',
        'max:255',
        Rule::unique('services')
            ->where(fn ($query) => $query->where('department_id', request()->input('params.department_id')))
            ->ignore($this->route('service')?->id)
    ],
    'params.department_id' => 'required|integer|exists:departments,id',
    'params.description' => 'nullable|string'
];

规则说明:

  • where子句限定了仅校验同一个department_id下的name重复问题,完全符合你要求的组合校验逻辑
  • ignore方法会在更新场景下自动排除当前编辑的服务记录,避免修改自身信息时误触发重复校验;创建场景下$this->route('service')为null,该规则自动失效,不影响创建校验
  • 额外补充的department_id的exists校验,可确保关联的部门真实存在,避免无效数据写入

3. 可选:自定义错误提示

可以在ServiceRequest的messages方法中添加更友好的报错信息:

public function messages()
{
    return [
        'params.name.unique' => '当前部门下已存在同名服务,请修改后重试',
    ];
}

内容的提问来源于stack exchange,提问作者Shokouh Dareshiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:15:00