在 Laravel 验证规则“存在”中使用模型关系

Fou*_*SSI 2 php laravel eloquent laravel-validation

数据库架构

users
 -id
 -name
 -email
 ...

roles
 -id
 -name
Run Code Online (Sandbox Code Playgroud)

用户可能具有多个角色,反之亦然(我已经在模型中定义了关系)

数据透视表

role_user
 -id
 -user_id
 -role_id
Run Code Online (Sandbox Code Playgroud)

验证规则尝试制定:user_id 必须存在于用户表中并且角色 id = 4

//...
'user_id' => ['nullable', Rule::exists('users')->where(
                function ($query) { 
                    $query->whereHas('roles', 
                        function ($q) { 
                            $q->where('id', 4); 
                        }
                    );
                }
)], 
//...
Run Code Online (Sandbox Code Playgroud)

错误消息:“SQLSTATE[42S22]:未找到列:1054 'where 子句'中存在未知列'has'(SQL:选择 count(*) 作为来自 userswhere user_id= 0 和 ( has= 角色) 的聚合)”

has*_*n05 6

我会用这个。这将解决您的问题,但我不知道这是否是最好的方法。

    use Validator; // on the top

    $validator = Validator::make($request->all(), [
        'user_id' => 'nullable|numeric|exists:users,id',
    ]);
    if ($validator->fails()) {            
        return response()->json($validator->errors(), 422);
    }
    $user = User::find($request->user_id);
    if(!$user || !$user->roles->first() || $user->roles->first()->id != 4) {
        return response()->json(['user_id'=>['You dont have permission.']], 422);
    }
Run Code Online (Sandbox Code Playgroud)

您可以尝试的另一种方法

'user_id'  => [
            'nullable',
            'numeric',
            'exists:users,id',
            function ($attribute, $value, $fail) { 
                $editorsIDs = User::whereHas('roles', function ($q) {
                    $q->where('id', 4);
                })->pluck('id');

                if(! $editorsIDs->contains($value)) {                        
                    $fail('You dont have permission.');
                }}
            ]
Run Code Online (Sandbox Code Playgroud)