Laravel 8 unique验证规则绑定user_id实现用户维度唯一性不生效如何解决
Laravel 8 按用户维度唯一验证规则错误修正
错误原因分析
- 第一种闭包写法:本身逻辑没有原则性错误,大概率是两个原因导致不生效:一是没有提前引入
Illuminate\Validation\Rule门面;二是执行验证前未做登录校验,导致Auth::id()返回空值,规则匹配逻辑错误。另外你写的闭包可以简化,不需要额外套一层闭包返回。 - 第二种字符串简写写法:参数顺序完全错误。字符串格式
unique规则的语法为unique:表名,字段,排除记录ID,主键字段名,额外条件字段,额外条件值,你将user_id放在了「排除记录ID」的位置,完全不符合业务需求。
正确写法
1. 闭包写法(推荐,可读性更高)
首先确保文件顶部引入Rule门面:
use Illuminate\Validation\Rule;
验证规则调整为:
// 执行验证前必须先做登录校验,保证Auth::id()有有效值 $validator = Validator::make($request->all(), [ 'brand' => [ 'required', 'string', Rule::unique('brands')->where('user_id', Auth::id()) ], 'url' => 'required|string', 'telephone' => 'required|string|size:11' ]);
2. 字符串简写写法
按参数顺序填写对应值即可:
'brand' => 'required|string|unique:brands,brand,NULL,id,user_id,' . Auth::id()
参数说明:
NULL:新增场景不需要排除已有记录,填NULL即可,更新场景替换为要修改的品牌IDid:对应brands表的主键字段名user_id:额外查询条件的字段Auth::id():额外查询条件的取值
额外注意事项
如果是更新品牌的场景,需要在规则中添加排除当前记录的逻辑,避免更新时触发自身重复的校验:
// 闭包写法更新场景示例,$brandId为当前要更新的品牌ID Rule::unique('brands')->ignore($brandId)->where('user_id', Auth::id())
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

