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(*) 作为来自
userswhereuser_id= 0 和 (has= 角色) 的聚合)”
我会用这个。这将解决您的问题,但我不知道这是否是最好的方法。
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)