带嵌套where条件的Laravel验证

2uluyalo  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(87)

**目标:**验证用户更新输入,目标是不允许特殊情况。应检查用户模型的关系(角色)。在以下情况下,不能为用户分配角色:状态为0Visitor。其他一切都是允许的。
**问题:**在我的Where条件实现中,验证在第一个条件处就已经失败了。因此,如果角色是访问者,则验证失败。第二个条件的状态根本不考虑。

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);
        })
    ];
}
wz8daaqr

wz8daaqr1#

如果你想限制roles.*,我假设它是Role模型表roles中的id,你可以使用Rule::notIn()方法:

public function rules() {
  return [
    'name' => 'required',
    'roles.*' => [
      Rule::notIn(Role::where('name', 'Visitor')->where('status', 0)->pluck('id'))
    ]
  ];
}

这将转换为Rule::notIn([1])(用Visitor角色的id替换1),如果roles.*的任何值是1,则验证将失败。

  • 旁注:您也可以使用Rule::in()执行此操作,但查询稍微复杂一些 *

参考文献:
https://laravel.com/docs/10.x/validation#rule-not-in
https://laravel.com/docs/10.x/validation#rule-in

相关问题