Symfony, как установить тройную связь?

#doctrine-orm #doctrine

Вопрос:

У меня есть схема данных, которая не очень сложна, но я действительно не вижу, как адаптировать ее к сущностям для Symfony …

Мне нужно настроить этот дизайн базы данных на Symfony: введите описание изображения здесь

Пользователь, имеющий доступ к одному или нескольким инструментам, обязательно имеет уникальную роль для каждого инструмента, к которому у него есть доступ.

На symfony я создал 3 сущности (Пользователь, Инструмент и Роль) без атрибута отношений, затем я создал сущность доступа, которая содержит отношения с 3 сущностями. Вот сущность доступа:

 class Access {  / **  * @ORM  Id  * @ORM  GeneratedValue  * @ORM  Column (type = "integer")  * /  private $ id;   / **  * @ORM  ManyToMany (targetEntity = User :: class, inversedBy = "accesses")  * /  private $ login;   / **  * @ORM  ManyToMany (targetEntity = Tool :: class, inversedBy = "accesses")  * /  private $ tool;   / **  * @ORM  ManyToOne (targetEntity = Role :: class, inversedBy = "accesses")  * @ORM  JoinColumn (nullable = false)  * /  private $ role;  // some function like construct, getters and setters  

Нужна ли мне эта сущность доступа?

Как соблюдать предыдущее правило управления?

Я хотел бы построить его чистым способом с помощью правильных методов, связанных с symfony.

Ответ №1:

В symfony роли устанавливаются для пользователя и извлекаются с помощью getRoles метода для сущности пользователя.

Если вы хотите иметь роль в разных инструментах, вам придется перезаписать этот метод getRoles

Однако при каждом изменении роли это приведет к отключению пользователя. (Пользователь должен будет ввести учетные данные при изменении платы за проезд)

Если это вас устраивает, вы можете управлять им, используя только 3 таблицы: пользователь/роль/инструмент

Когда пользователь вошел в систему, вы можете отобразить все доступные инструменты (пользователь -gt; роли -gt;gt; инструмент для каждой роли).

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

Комментарии:

1. Спасибо за ваше предложение. Пользователь может захотеть сменить инструмент, чтобы переключиться на инструмент, в котором у него другая роль (например, инструмент, в котором он является администратором, на инструмент, в котором он ничего не может изменить). Я хочу, чтобы пользователь мог простым способом изменять инструменты. Если пользователю необходимо выйти из системы для переключения ролей (чтобы получить роль для инструмента), это не совсем подходящее решение для меня. Я разрабатываю платформу, на которой пользователь один раз входит в систему, чтобы получить доступ к своим инструментам, я не хочу, чтобы они выходили из системы, чтобы переключаться с одного инструмента на другой среди инструментов, к которым у них есть доступ.