#php #laravel #relation
В базе данных есть следующие таблицы: users (id, name, surname) teams (id, name) roles (id, name) permissions (id, name) team_role_permission (team_id, role_id, permission_id) team_user (user_id, team_id, role_id) Не понимаю, как именно я должен описать отношения в таблице team_role_permission и team_user. В обычных отношениях laravel нет возможности создать many-to-many отношение с 3 полями. Если говорить про практику, то мне нужно иметь лишь 3 описанных отношения в БД: В каких командах играет игрок и какова его роль в каждой из них (метод teams в модели User/Player) Какие игроки состоят в команде и каковы их роли (метод players в модели Team) Таблица team_role_permission нужна, поскольку в каждой команде создатель может кастомно выбирать роли для каждой роли пользователей.
Ответы
Ответ 1
По идее это может выглядеть вот так. И никто не запрещает вам создать модель TeamUser, в которой вы укажете нужные связи. Ну или как вы делали, но опять же с созданием промежуточной таблицы со связями.Ответ 2
Начнем по порядку: "В каких командах (team_id) играет игрок (user_id) и какова его роль(role_id) в каждой из них (метод teams в модели User/Player)" Для этого существует team_user (user_id, team_id, role_id). Понятней было бы в таком порядке team_id, user_id, role_id. "Какие игроки (user_id) состоят в команде (team_id) и каковы их роли (role_id) (метод players в модели Team)" Данный вопрос покрывает та же связь team_user (user_id, team_id, role_id). "Таблица team_role_permission нужна, поскольку в каждой команде (team_id) создатель (?) может кастомно выбирать роли (role_id) для каждой роли(role_id) пользователей (user_id)." Возможно имелось ввиду "выбирать роли (role_id) для каждого пользователя (user_id)", тогда team_role_permission не нужна. Точнее нужна только для связи команды с permission. Но, если все таки имелось ввиду то, что написано, тогда должна существовать связь "создатель", team_id, user_id, role_id, role_id. По сути это подмена роли другой ролью, что в общем не очень хорошо. Если у одного игрока может быть несколько ролей в одной команде тогда связь team_user следовало бы разбить на две: team_user (team_id, user_id) и team_user__role(team_user_id, role_id).
Комментариев нет:
Отправить комментарий