Laravel嵌套Where条件验证异常:无法正确限制状态为0的Visitor角色
修正Laravel用户角色分配的验证规则
需求目标
禁止为用户分配状态为0的Visitor角色,其余所有角色分配场景均允许通过验证。
现有问题
当前的嵌套where条件逻辑完全错误:它要求所有通过验证的角色必须是Visitor且状态不为0,这直接导致所有非Visitor角色都无法通过验证,完全违背了需求。
关联表结构
users: id, name roles: id, name, permissions, status
错误的验证规则代码
public function rules() { return [ 'name' => 'required', 'roles.*' => [Rule::exists(Role::class, 'id') ->where(function (Builder $q) { $q->where('name', 'Visitor') ->where('status', '!=', 0); }) ]; }
修正后的验证规则
核心是构造正确的否定逻辑:排除「角色为Visitor且状态为0」的情况,其余角色全部允许。
use Illuminate\Database\Eloquent\Builder; use Illuminate\Validation\Rule; public function rules() { return [ 'name' => 'required', 'roles.*' => [ Rule::exists(Role::class, 'id') ->where(function (Builder $query) { // 禁止条件:角色是Visitor 且 状态为0 $query->whereNot(function (Builder $q) { $q->where('name', 'Visitor') ->where('status', 0); }); }) ] ]; }
逻辑说明
- 用
whereNot包裹需要禁止的组合条件,只要角色不属于「Visitor+状态0」的情况,就能通过验证。 - 状态不为0的
Visitor角色、以及所有非Visitor角色,都能正常通过验证,完全符合需求。
内容的提问来源于stack exchange,提问作者MartinTTS
相关产品推荐
相关产品推荐

