检索中间人对象中关系的另一面

时间:2011-12-15 19:05:02

标签: many-to-many symfony doctrine-orm

对不起,如果标题没有多大意义,如果您对我的问题有更准确的描述有建议,请提出建议。

我正在研究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;
}

2 个答案:

答案 0 :(得分:3)

几年前我解决了友谊问题。我不记得所有的细节,但我会尽力告诉你我的记忆。

首先,请看一下section,其中说:

  

真正的多对多关联不太常见。 [...]

     

为什么多对多关联不太常见?因为经常要将其他属性与关联关联,所以在这种情况下引入关联类。因此,直接的多对多关联消失,并被3个参与类之间的一对多/多对一关联所取代。

所以,我有UserFriendship个实体,这些实体已映射到userfriendship表。后者看起来像这样:

| 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)的方法,它会产生一个数据库请求,比如“查找{{1}所有的友谊}等于from$user等于to“。 (可能这个查询还有别的东西,但是我记不住了。)在你拥有一组来自数据库的友谊之后,迭代它并列出所有朋友是微不足道的。你可以得到这样友谊的另一面:

$user

答案 1 :(得分:0)

如果您只存储引用,则可以维护一组并行的用户和关系。

$user = $this->getCurrentUser();
$friends[] = $user->getFriends();
$friendships[] = $user->getFriendships();

朋友[0]与$ user有友谊关系[0]。

这是速度空间的一个非常标准的权衡,当然需要插入/删除等额外的步骤。

如果您要存储对象而不是引用,那么这可能会非常快地占用大量空间,并且您最好将友谊保存为完全独立的列表并搜索包含$ user的所有友谊。 / p>