2

我有两个实体代表用户 ( User) 和友谊请求 ( FriendshipRequest)。User 和 FriendshipRequest 之间存在 oneToMany 关系,因此 Doctrine 创建了一个getFriendshipRequests()在 User 类中调用的方法。这没关系,但是 FriendshipRequest 有一个称为 status 的属性,所以我希望 User 类可以过滤与其关联的友谊请求,以关注他们的状态。我已经阅读了 Doctrine 文档,我发现了这一点:

在本机您不能过滤 2.0 和 2.1 中的关联。您应该使用 DQL 查询来查询过滤后的实体集。

据此,我想我应该创建一个 FriendshipRequest 存储库并创建一个名为“findByStatusAndUser”(或类似的东西)的方法,但我认为这是一个糟糕的解决方案。

我想在 User 实体中有一个方法,例如getPendingStatusRequests(). 这可能吗?如果不是,最好的解决方案是什么?

4

3 回答 3

2

从 Doctrine 2.3 开始,您可以使用match 和 Criteria
然后你可以getPendingStatusRequests()像你想要的那样在用户实体中使用。对于您的示例,代码如下所示:

public function getPendingStatusRequests()
{
    $criteria = Criteria::create(); //don't forget to use Doctrine\Common\Collections\Criteria;
    $criteria->where(Criteria::expr()->eq('status', 1));

    return $this->friendshipRequests->matching($criteria);
}
于 2016-02-07T10:08:00.260 回答
1

我认为 FriendshipRequest 存储库中的“getPendingRequestsForUser($user)”方法应该是一个很好的解决方案。在此方法中,您只需要创建一个适当的 DQL。

这是一个很好的解决方案,因为所有逻辑都应该移到存储库中,使实体尽可能小而干净。

UPD:另外,您可以使用 findBy 方法,如此所述,例如:

$pendingRequests = $em->getRepository('MyBundle:FriendshipRequest')->findBy(
    array('user' => $user->getId(), 'status' => 1)
);

但对我来说,首选第一种方法。

于 2012-08-03T11:12:40.860 回答
0

您当然可以将 getPendingStatusRequests() 添加到用户,然后让它循环遍历所有友谊请求,并仅返回具有适当状态的那些。

唯一潜在的问题是所有的友谊请求都会被加载,包括那些你不需要的。由您决定这是否是一个真正的问题。可能是,一旦处理了友谊请求,就会将其删除,因此用户在任何给定时间都不会有很多请求。

如果您确实想避免加载所有请求,请进行查询并在连接子句上使用 WITH 表达式。就像是:

$qb->leftJoin('user.friendshipRequests','request', 
        Expr\Join::WITH, $qb->expr()->eq('request.status', $qb->expr()->literal('Pending')));

而且由于您使用的是 S2,因此我不会在存储库中胡闹。只需创建一个名为 UserManager 的服务,注入实体管理器,然后给它一个名为 loadUserWithPendingFriendshipRequests 的方法。

于 2012-08-03T13:45:00.620 回答