当前位置 : 主页 > 网络推广 > seo >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
很抱歉,如果标题没有多大意义,如果您对我的问题有更准确的描述有建议,请提出建议. 我正在研究一个Symfony 2应用程序,我有User对象必须与另一个用户有关,简单的用例是朋友,但也有更复
很抱歉,如果标题没有多大意义,如果您对我的问题有更准确的描述有建议,请提出建议.

我正在研究一个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();
网友评论