2012-02-03 4 views
4

Я пытаюсь разработать систему друзей, и мне нужно отношение Many-To-Many к объектам User; на данный момент, это то, что я сделал:Самостоятельное отношение «многие ко многим» с дополнительными полями?

/** 
* @ORM\ManyToMany(targetEntity="User", mappedBy="friends") 
*/ 
protected $friendsWith; 

/** 
* @ORM\ManyToMany(targetEntity="User", inversedBy="friendsWith") 
* @JoinTable(name="friends", 
*   joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
*   inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")} 
*   ) 
*/ 
protected $friends; 

Но я хотел бы иметь некоторые дополнительные поля для этих отношений, например дата создания или государство (принято, в ожидании, ...); Я создал другой объект «Друг», и я хотел бы, чтобы этот объект использовался в качестве ссылки между друзьями. Но я не знаю, как это сделать ...

У вас есть идеи?

Спасибо!

ответ

8

Боюсь, вам нужен дополнительный класс, чтобы создать такую ​​ассоциацию. Вот совет от документации доктрины:

Почему ассоциации «многие ко многим» реже встречаются? Потому что часто вам нужно связать дополнительные атрибуты с ассоциацией, в которой случае вы вводите класс ассоциации. Следовательно, прямая ассоциация исчезает и заменяется ассоциациями «один-много-много-один-один» между 3 участвующими классами .

http://www.doctrine-project.org/docs/orm/2.1/en/reference/association-mapping.html#many-to-many-unidirectional

Я предполагаю, что это должно быть Friend -> Специальные ассоциации класса (с fileds: user_id, friend_id, дата создания) -> Друг. И вы связываете Другу со специальным классом в двух поданных $ myFriends и $ imFriendOf :)

+0

Но я не вижу здесь ассоциаций. :/ Пользователь -> OneToMany -> Друг, Друг -> ManyToOne -> Пользователь? Существует 3 класса, но только 2 здесь, потому что это самосообщение на пользователе. –

+0

Я отредактировал свой ответ, проверьте, ясно ли это сейчас. –

+0

Ок, я думаю, я понимаю, это в основном та же идея, но я просто сопоставляю с другим классом, а не непосредственно с пользователем, не так ли? –

Смежные вопросы