Я решил проблему дружбы пару лет назад.Я не помню всех деталей, но я постараюсь рассказать вам, что я помню.
Прежде всего, посмотрите на этот раздел , в котором написано:
Реальные ассоциации «многие ко многим» встречаются реже.[...]
Почему ассоциации «многие ко многим» встречаются реже?Потому что часто вы хотите связать дополнительные атрибуты с ассоциацией, и в этом случае вы вводите класс ассоциации.Следовательно, прямая ассоциация «многие ко многим» исчезает и заменяется ассоциациями «один ко многим / многие к одному» между 3 участвующими классами.
Итак, у меня было User
и Friendship
сущности, которые были сопоставлены с таблицами user
и friendship
.Последнее выглядело примерно так:
| friendship |
+--------------+
| from_id |
| to_id |
| requested_at |
| accepted_at | ← if this is not null, then it was accepted
Так как я предпочитаю быть проще, мои User
сущности не знали о Friendship
сущностях - то есть класс Friendship
ссылался наUser
класс в однонаправленной манере.В вашем случае это означает, что вы не можете получить список друзей из класса User
.Вы, конечно, можете реализовать это так, как это возможно.
Затем у меня был класс FriendshipService
(шаблон Service Layer ), в котором был метод, подобный findBy(User $user)
, который будет делать запрос к базе данных типа «найти всех друзей, где from
равно $user
или to
равно $user
».(Возможно, в этом запросе было что-то еще, но я не могу вспомнить.) После того, как у вас есть набор друзей из базы данных, перебирать и перечислять всех друзей тривиально.Вы можете получить другую сторону дружбы, как это:
$otherSide =
$friendship->getFrom() == $currentUser ?
$friendship->getTo() :
$friendship->getFrom();