我正在研究一个Symfony 2应用程序,我有User对象必须与另一个用户有关,简单的用例是朋友,但也有更复杂的情况.最初我有一个简单的多对多用户之间的关系,生活很盛大.
现在我需要跟踪两个用户之间关系本身的元数据,例如:
>当请求关系时
>当它被接受
>结束时
>如果它结束了,是否有阻止这种关系重新开放的阻止
>等
我做了一些研究,似乎在Doctrine我不能拥有关系本身的元数据,因为它们不是实体.有人建议我使用中间人对象,因此用户与友谊对象有多对多的关系.友谊对象包含元数据和对两个用户的引用.
现在我的问题,如果我有这个友谊对象,我如何检索它的另一面?我是否有一个功能,我通过我认识的用户,所以我得到了另一个用户?我想到实现这一点的一种方法如下,但在我看来应该有另一种方式
$user = $this->getCurrentUser(); $friends = array(); foreach($user->getFriends() as $friendship) { $friends[] = $friendship->not($user); // return the user we dont have }
和$friendship-> not()是:
public function not($user) { return $this->user1===$user ? $this->user2 : $this->user1; }几年前我解决了友谊问题.我不记得所有的细节,但我会告诉你我记得的.
首先,看看这个section,它说:
Real many-to-many associations are less common. […]
Why are many-to-many associations less common? Because frequently you want to associate additional attributes with an association, in which case you introduce an association class. Consequently, the direct many-to-many association disappears and is replaced by one-to-many/many-to-one associations between the 3 participating classes.
所以,我有User和Friendship实体,它们被映射到用户和友谊表.后者看起来像这样:
| friendship | +--------------+ | from_id | | to_id | | requested_at | | accepted_at | ← if this is not null, then it was accepted
由于我更喜欢保持简单,我的用户实体不知道友谊实体 – 也就是说,友谊类以单向方式引用了User类.在您的情况下,这意味着您无法从User类中获取朋友列表.当然,您可以通过允许您执行此操作的方式实现它.
然后,我有了这个FriendshipService类(Service Layer模式),它有一个像findBy(User $user)这样的方法,它会产生一个数据库请求,比如“查找所有友谊从等于$user或等于$user”. (可能这个查询还有别的东西,但是我记不住了.)在你拥有一组来自数据库的友谊之后,迭代它并列出所有朋友是微不足道的.你可以得到这样友谊的另一面:
$otherSide = $friendship->getFrom() == $currentUser ? $friendship->getTo() : $friendship->getFrom();