Laravel中如何实现仅检查is_active=1数据行的Unique Validation?
Laravel 实现仅验证活跃数据的唯一规则
当然可以实现,你之前的验证规则参数顺序错误,导致逻辑不生效。Laravel的unique规则有特定的参数格式,要添加额外条件(比如is_active=1)需要按正确顺序传递参数,或者用更灵活的闭包写法:
方法一:使用规则参数
unique规则的完整参数格式为:unique:表名,列名,忽略的ID,ID列名,额外条件列名,额外条件值
新增数据时(无需忽略任何ID):
验证email在is_active=1的用户中唯一,规则写法如下:'email' => 'unique:users,email,NULL,id,is_active,1'这里
NULL表示不忽略任何记录,后续的is_active,1指定只检查活跃状态的数据。更新数据时(需要忽略当前记录的ID):
比如编辑ID为$user->id的用户时,忽略自身的email,只检查其他活跃用户的唯一性:'email' => 'unique:users,email,' . $user->id . ',id,is_active,1'
方法二:使用闭包(更灵活推荐)
如果需要更复杂的条件,或者在FormRequest中使用,推荐用Rule类的闭包写法:
use Illuminate\Validation\Rule; // 新增场景 'email' => [ 'required', 'email', Rule::unique('users')->where(function ($query) { return $query->where('is_active', 1); }) ] // 更新场景(忽略当前用户) 'email' => [ 'required', 'email', Rule::unique('users')->where(function ($query) { return $query->where('is_active', 1); })->ignore($this->user) // $this->user是当前要更新的模型实例,也可以传ID ]
为什么你的原规则不生效?
你之前写的unique:users,email,is_active,1参数顺序错误:第三个参数应该是要忽略的ID,而你把is_active放在了这里,Laravel会把它当作要忽略的ID值,导致逻辑完全不符合预期。
内容的提问来源于stack exchange,提问作者Jigar
相关产品推荐
相关产品推荐

