对不起,如果标题没有多大意义,如果您对我的问题有更准确的描述有建议,请提出建议。
我正在研究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;
}
答案 0 :(得分:3)
首先,请看一下section,其中说:
真正的多对多关联不太常见。 [...]
为什么多对多关联不太常见?因为经常要将其他属性与关联关联,所以在这种情况下引入关联类。因此,直接的多对多关联消失,并被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)
的方法,它会产生一个数据库请求,比如“查找{{1}所有的友谊}等于from
或$user
等于to
“。 (可能这个查询还有别的东西,但是我记不住了。)在你拥有一组来自数据库的友谊之后,迭代它并列出所有朋友是微不足道的。你可以得到这样友谊的另一面:
$user
答案 1 :(得分:0)
如果您只存储引用,则可以维护一组并行的用户和关系。
$user = $this->getCurrentUser();
$friends[] = $user->getFriends();
$friendships[] = $user->getFriendships();
朋友[0]与$ user有友谊关系[0]。
这是速度空间的一个非常标准的权衡,当然需要插入/删除等额外的步骤。
如果您要存储对象而不是引用,那么这可能会非常快地占用大量空间,并且您最好将友谊保存为完全独立的列表并搜索包含$ user的所有友谊。 / p>