Модель списка смежности для пользовательских типов

У меня достаточно большое количество пользовательских типов, которые мне нужны в моей базе данных, и до сих пор единственный хороший вариант, который не включает в себя множество таблиц, - это использование модели списка смежности. В основном, мои пользователи сначала делятся на следующие типы: Бизнес, Индивидуальный и Администратор. Оттуда это выглядит так:
введите описание изображения здесь

Примечание. В настоящее время у меня есть 3 уровня типов пользователей, но это может со временем меняться в зависимости от потребностей бизнеса.

Все мои пользователи имеют общий users таблица, содержащая такие данные, как адрес электронной почты, пароль, имя, фамилия и т. д. У всех моих бизнес-пользователей есть отдельный businesses таблица, в которой хранятся данные, специфичные для бизнеса. businesses не все пользователи имеют одни и те же поля, но, поскольку мне нужно всего несколько полей для каждого пользователя другого типа, я подумал, что лучше всего было бы объединить все поля в одну таблицу и сохранить значение NULL для полей, которые мне не нужны. использовать.

Теперь у меня есть этот простой сценарий. У всех моих пользователей есть страница профиля пользователя. У моих бизнес-пользователей также есть страница бизнес-профиля. У моих бизнес-техников должна быть другая страница, специфичная для них. Представьте, что компьютерный техник входит в систему. Я хочу иметь возможность отображать ссылку на страницу профиля, страницу бизнес-профиля и панель инструментов для технического специалиста.

Чтобы получить тип пользователя, у меня есть настройки моей модели, чтобы я мог получить "дочерний" или "родительский". Если я говорю:

$user = new User::find(11);
$userType = $user->userType; //(relation set in the UserType & User Models)
while($userType != NULL) {
   dump($userType->name);
   $userType = $userType->parent; //(relation set in UserType Model)

}
// dump result:
// 11 - Computer Technician
// 5 - Technicians
// 1 - Business

Как легко реализовать способ проверки технических специалистов (для предоставления ссылки на панель мониторинга технических специалистов), а также проверки предприятий (для предоставления ссылки на страницу профиля предприятия)?

0 ответов

Я создал пакет, который использует общие табличные выражения (CTE) для реализации рекурсивных отношений: https://github.com/staudenmeir/laravel-adjacency-list

Вы можете использовать ancestorsAndSelf Отношение для проверки конкретных типов пользователей:

class UserType extends Model
{
    use \Staudenmeir\LaravelAdjacencyList\Eloquent\HasRecursiveRelationships;
}

$user = User::find(11);

$userTypes = $user->userType->ancestorsAndSelf;

if ($userTypes->where('name', 'Technicians')->isNotEmpty()) {
    //
}

if ($userTypes->where('name', 'Business')->isNotEmpty()) {
    //
}
Другие вопросы по тегам