banderos120
@banderos120
Играю на балалайке

Как правильно организовать связь многие ко многим в Symfony2 Doctrine2?

Здравствуйте.
Есть две таблицы (таблицы для примера, но они отображают суть проблемы):
-------------------
Users:
- id
- name
--------------------
Followers:
- id
- user_id
- follower_id
--------------------

Мне нужно связать эти таблицы таким образом, чтобы для конкретного пользователя можно было получить его подписчиков, так и для подписчика, можно было бы получить всех, на кого он подписан. Соответственно рассматривал связь Many-To-Many, Self-referencing. В примере, связи устанавливаются в таблице пользователя, что значит при каждом запросе пользователя, он будет тянуть и его подписчиков и тех на кого он подписан (в моем случае) . Мне нужно, чтобы связи были установлены в таблицу "Followers", чтобы при запросе по пользователю:
$repository->findOneBy(array('user' => $this->getUser()));

Отдавались данные вида:
- id
- user (Объект пользователя)
- followers (Массив объектов пользователей)
Возможно ли такое сделать ? Если возможно ,то каким образом прописать аннотации ManyToMany ?
  • Вопрос задан
  • 3528 просмотров
Решения вопроса 1
keltanas
@keltanas
Software Developer
Вам не надо ManyToMany между User и Follower, т.к. Follower - это и так юзер. Т.е. нужна связь ManyToMany между Users и Users :) Это же вы и сделали в примере с 2 таблицами. Но, такой вариант будет не очень-то гибок.

Лучше будет сделать отдельную сущность Followship в которой установить 2 связи к User типа OneToMany. Но, только в том случае, если для Followship надо хранить еще какие-то св-ва, например createdAt.

Собственно, пример, который вы нашли вполне справедлив и готов к использованию.

Чтобы получить, кто подписан на пользователя, обратитесь к св-ву $friendsWithMe.
Чтобы получить, на кого подписан пользователь, см. $myFriends.

Какую в вашем примере несет информацию идентификатор подписанности?

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

Что значит "тянуть"? Почему вы так решили? Зависит, как вы жадность для связи установите.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы