Как привязать модель к роли Spatie?

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Немного сложно понять, что вы ищете, не зная, как вы настроили архитектуру под этим, но вы можете добраться до Докторов... хотя не уверен в прямом связывании.

Я предполагаю, что вы создали роль 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, вы можете сделать это как минимум в два этапа.

Я не получил это $docs= Doctor::role('doctor')->get();. Что это такое?

Jony 01.01.2023 22:06

Это запрос, чтобы предоставить вам каждого пользователя (или врача, если вы создали этот класс), у которого есть роль доктора. Если вы используете базовый класс User, а затем перебираете эту коллекцию с помощью get_class, это один из способов найти объекты класса Doctor в зависимости от того, как вы запускаете конструктор... возможно. Или иметь жесткое разделение с классом и назначить роль. Я не могу найти прямого способа сделать это в SPatie, но я думаю, что это связано с тем, что они наверняка предполагают, что люди будут использовать флаг для объекта User вместо полного класса (или просто роли). Но это не значит, что это нельзя сделать, как описано выше или подобное.

Watercayman 01.01.2023 22:13

Итак, мне нужно получить модель для пользователя auth

Jony 01.01.2023 22:48

Я пробовал ``$user = Auth::user()->getRoleNames(); dd($user);``` но он пустой

Jony 01.01.2023 22:52

Хм, этот метод возвращает набор ролей, прикрепленных к пользователю. Я бы назвал переменную так, чтобы избежать путаницы: $roles = $user->getRoleNames();. Если вы не назначали этому пользователю никаких ролей (ранее использовали assignRole()), коллекция $roles будет пустой.

Watercayman 01.01.2023 22:57

Проблема в том, что модель пользователя не имеет отношения к модели врача. Но в таблице доктора БД есть фк к пользователю как (user_id). Поэтому, когда я прикрепляю роль к модели врача, она использует Doctor.id. вместо этого Doctor.user_id. Вот почему я не получаю роли от Auth()->user()->getRolesNamer(). Не могли бы вы помочь мне с этим?

Jony 01.01.2023 23:00

Похоже, вы можете немного пересмотреть свою архитектуру. Если Доктор является аутентифицированным пользователем и к нему применяются роли пользователя вашего приложения, то, возможно, это должен быть объект User или расширенный объект. Если врач не является аутентифицированным пользователем (это просто информация о человеке в базе данных), то использование роли может быть не лучшим способом настроить это — вместо этого используйте флаг на объекте «Доктор». Или, если Doctor является независимым типом User, то добавьте трейт HasRoles к объекту Doctor, но это кажется слишком накладным, вместо использования User и добавления флага к этому классу.

Watercayman 01.01.2023 23:19

Итак, как быть? Я могу определить отношения в пользовательской модели, такие как врач, пациент, клиника, чтобы связать их с соответствующими моделями. Но я постарался избежать этой замены по ролям. Точно у меня есть модель пользователя по умолчанию для авторизованного пользователя. И я попытался найти роли для этого пользователя и вернуть модель, зависящую от роли.

Jony 01.01.2023 23:34

Мне трудно сказать, не зная всей цели вашего кода. Но я бы предложил (насколько я понимаю, как вы это делаете): если врач, пациент и клиника должны войти в систему, то сделайте их аутентифицируемыми пользователями с ролями. Если это просто точки данных (и не нужно входить в систему), просто сделайте их структурой данных, не привязанной к пользователю, не привязанной к роли. Эта точка данных может быть type и может быть «врач», «пациент» и т. д. Это было бы похоже на таблицу с пользователем и скажем... Сотрудник. У сотрудника может быть поле type для «врача» или чего-то еще.

Watercayman 02.01.2023 00:14

Другие вопросы по теме