Модель списка смежности для пользовательских типов
У меня достаточно большое количество пользовательских типов, которые мне нужны в моей базе данных, и до сих пор единственный хороший вариант, который не включает в себя множество таблиц, - это использование модели списка смежности. В основном, мои пользователи сначала делятся на следующие типы: Бизнес, Индивидуальный и Администратор. Оттуда это выглядит так:
Примечание. В настоящее время у меня есть 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()) {
//
}