Laravel如何实现多字段联合唯一约束:key按project_page_id分组唯一
问题原因
你当前的Unique验证规则参数顺序完全错误,Laravel自带的unique字符串规则默认语法为 unique:表名,验证字段,忽略的记录ID,忽略ID的字段名,额外条件字段1,额外条件值1,额外条件字段2,额外条件值2...,你之前的写法将额外条件字段放到了忽略ID的参数位,导致验证逻辑完全不符合预期。
解决方案
推荐使用Rule类链式调用的写法,可读性更高、不容易写错参数顺序,兼容新增、更新两种场景:
- 首先在验证规则所在文件顶部引入Rule类:
use Illuminate\Validation\Rule;
- 调整验证规则写法如下:
// 先取到当前提交的项目页面ID $projectPageId = request()->input('project_page_id'); $id = request()->route()->parameter('keyword')?->id; return [ // 验证project_page_id合法,避免传入无效ID 'project_page_id' => ['required', 'integer', 'exists:project_pages,id'], 'key' => [ 'required', Rule::unique('keywords', 'key') // 追加条件:只匹配同project_page_id下的记录 ->where('project_page_id', $projectPageId) // 更新场景忽略当前编辑的记录,新增场景$id为null不影响逻辑 ->ignore($id) ], ];
如果你坚持要用字符串形式的验证规则,写法如下:
- 新增场景(无要忽略的ID):
'key' => 'required|unique:keywords,key,NULL,id,project_page_id,'.$projectPageId - 更新场景(忽略当前编辑的ID):
'key' => 'required|unique:keywords,key,'.$id.',id,project_page_id,'.$projectPageId
内容的提问来源于stack exchange,提问作者GPiter
相关产品推荐
相关产品推荐

