Doctrine ManyToMany,找到相关的,没有相关的结果

时间:2015-07-08 06:53:39

标签: symfony doctrine-orm

我有一个名为锦标赛的实体,用户可以注册参加。

两个实体之间的关系是ManyToMany,需要创建一个Symfony2视图,其中列出所有锦标赛,有或没有注册用户,以便他们可以加入。

这是我的DoctrineQueryBuilder

$em->createQueryBuilder('d')
   ->select('d, i, u')
   ->leftJoin('d.item','i')
   ->leftJoin('d.users','u')
   ->where('d.active = 1')
   ->andWhere('d.state = 1')
   ->orderBy('d.dateStart', 'ASC');

我还需要获得加入锦标赛的用户数量。

1 个答案:

答案 0 :(得分:0)

<强>序言

有各种方法来实现你想要的。您可以创建一个子查询来进行计数,但更简单的解决方案是让doctrine为您处理这个问题。

下面描述的解决方案基于Doctrine lazy / eager loading功能。当学说加载一个实体时,它也会懒惰或急切地填充它的关联(默认是懒惰的)。

<强>解决方案

假设您的Tournament实体将用户关联映射为ManyToMany关系。您可以创建一个计算Tournament->users的新方法。

ManyToMany关联将使用ArrayCollection填充实体属性(在本例中为$users)。

一个名为countUsers的方法可以实现以下示例实现:

...
class Tournament {
...
/**
 * @ManyToMany(targetEntity="User")
 * @JoinTable(name="tournament_users",
 *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="tournament_id", referencedColumnName="id"}
 *      )
 **/
private $users;
...
public function countUsers(){
    return $this->users->count();
}

在迭代锦标赛集合的视图中,只需调用$tournament->countUsers()方法即可显示计数。

<强>参考文献:

ArrayCollection: http://www.doctrine-project.org/api/common/2.1/class-Doctrine.Common.Collections.ArrayCollection.html