Использование связей моделей в Laravel Правило валидации «Существует» - PullRequest
0 голосов
/ 30 января 2020

Db схема

users
 -id
 -name
 -email
 ...

roles
 -id
 -name

Пользователь может иметь несколько ролей и наоборот (я уже определил отношения в моделях)

сводная таблица

role_user
 -id
 -user_id
 -role_id

Правило валидации пытается сделать: user_id должен существовать в таблице пользователей и иметь роль ID = 4

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

Сообщение об ошибке: «SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'имеет' в 'предложении где' (SQL: выберите количество (*) в качестве совокупности из users, где user_id = 0 и (has = роли)) "

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Я бы использовал это. Это решит вашу проблему, но я не знаю, является ли это лучшим способом или нет.

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

Другой способ, которым вы можете попробовать

'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.');
                }}
            ]
0 голосов
/ 30 января 2020

Я разрешаю, используя

$usersWhereHasEditorRole = User::whereHas('roles', function ($q) {
     $q->where('id', 4);
})->pluck('id')->unique('id')->toArray();

$validator = Validator::make($request->all(), [
                'name' => 'required|alpha', // commun
                'email' => 'required|email|unique:users', // commun
                'password' => 'required|min:8|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/|regex:/[@$!%*#?&]/', // commun
                'c_password' => 'required|same:password', // commun
                //...
                'user_id' => ['nullable', Rule::in($usersWhereHasEditorRole)],
                //...
]);


if ($validator->fails()) {
      return $this->sendError('Validation Error.', $validator->errors(), 400);
}

dd('passes');
...