Можно ли привязать конкретную модель к роли в Spatie laravel разрешения?
Мне нужно получить модель зависит от роли. Например, если у пользователя есть роль доктора, мне нужно получить модель доктора. То же самое для роли клиники.






Немного сложно понять, что вы ищете, не зная, как вы настроили архитектуру под этим, но вы можете добраться до Докторов... хотя не уверен в прямом связывании.
Я предполагаю, что вы создали роль Spatie и назначили ее классу Doctor (который, как я предполагаю, является расширенным пользователем или аналогичным и использует HasRoles):
$role = Role::create(['name' => 'doctor']);
Возьмите доктора и назначьте ему роль как обычно:
$doctor = Doctor::find(xxx);
$doctor->assignRole($role);
Я думаю, что нижеследующее может помочь:
$role= Role::findByName('doctor');
$roleClass= $role->getModel();
Для Документов с ролью доктора
$docs= Doctor::role('doctor')->get();
Если вы хотите различать классы (Доктор, Пользователь), вам нужно будет запустить дополнительную команду для $doc (или даже надмножества, такого как User::role коллекция), например get_class, но это будет зависеть от того, как вы установили запрос и течь вверх. Я не уверен, что в Spatie есть прямой метод, позволяющий делать именно так, как вы хотите, но если вы согласны с получением расширенной коллекции пользователей, которая может включать класс Doctor, вы можете сделать это как минимум в два этапа.
Это запрос, чтобы предоставить вам каждого пользователя (или врача, если вы создали этот класс), у которого есть роль доктора. Если вы используете базовый класс User, а затем перебираете эту коллекцию с помощью get_class, это один из способов найти объекты класса Doctor в зависимости от того, как вы запускаете конструктор... возможно. Или иметь жесткое разделение с классом и назначить роль. Я не могу найти прямого способа сделать это в SPatie, но я думаю, что это связано с тем, что они наверняка предполагают, что люди будут использовать флаг для объекта User вместо полного класса (или просто роли). Но это не значит, что это нельзя сделать, как описано выше или подобное.
Итак, мне нужно получить модель для пользователя auth
Я пробовал ``$user = Auth::user()->getRoleNames(); dd($user);``` но он пустой
Хм, этот метод возвращает набор ролей, прикрепленных к пользователю. Я бы назвал переменную так, чтобы избежать путаницы: $roles = $user->getRoleNames();. Если вы не назначали этому пользователю никаких ролей (ранее использовали assignRole()), коллекция $roles будет пустой.
Проблема в том, что модель пользователя не имеет отношения к модели врача. Но в таблице доктора БД есть фк к пользователю как (user_id). Поэтому, когда я прикрепляю роль к модели врача, она использует Doctor.id. вместо этого Doctor.user_id. Вот почему я не получаю роли от Auth()->user()->getRolesNamer(). Не могли бы вы помочь мне с этим?
Похоже, вы можете немного пересмотреть свою архитектуру. Если Доктор является аутентифицированным пользователем и к нему применяются роли пользователя вашего приложения, то, возможно, это должен быть объект User или расширенный объект. Если врач не является аутентифицированным пользователем (это просто информация о человеке в базе данных), то использование роли может быть не лучшим способом настроить это — вместо этого используйте флаг на объекте «Доктор». Или, если Doctor является независимым типом User, то добавьте трейт HasRoles к объекту Doctor, но это кажется слишком накладным, вместо использования User и добавления флага к этому классу.
Итак, как быть? Я могу определить отношения в пользовательской модели, такие как врач, пациент, клиника, чтобы связать их с соответствующими моделями. Но я постарался избежать этой замены по ролям. Точно у меня есть модель пользователя по умолчанию для авторизованного пользователя. И я попытался найти роли для этого пользователя и вернуть модель, зависящую от роли.
Мне трудно сказать, не зная всей цели вашего кода. Но я бы предложил (насколько я понимаю, как вы это делаете): если врач, пациент и клиника должны войти в систему, то сделайте их аутентифицируемыми пользователями с ролями. Если это просто точки данных (и не нужно входить в систему), просто сделайте их структурой данных, не привязанной к пользователю, не привязанной к роли. Эта точка данных может быть type и может быть «врач», «пациент» и т. д. Это было бы похоже на таблицу с пользователем и скажем... Сотрудник. У сотрудника может быть поле type для «врача» или чего-то еще.
Я не получил это $docs= Doctor::role('doctor')->get();. Что это такое?