Doctrine Query Builder其中ManyToMany的计数大于

时间:2014-05-07 00:56:49

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

我正在使用Doctrine查询生成器,并且有一个非常具体的要求。

我在我的实体中使用ManyToMany字段,与用户实体关联(用户帐户实体数组)相关。

/**
 * @var ArrayCollection
 *
 * @ORM\ManyToMany(targetEntity="User", cascade={"persist"})
 * @ORM\JoinTable(name="post_user_list")
 */
protected $userList;

在显示“公共帖子”的要求中,要求实体的已发布布尔值设置为true,发布日期小于当前日期,并且两个用户与实体关联。

在我的查询构建器中,我设置了这个:

$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select($select)->from($this->getEntityName(), 'p');
$criteria = $qb->expr()->andX();
$criteria->add($qb->expr()->eq('p.editor_published', 1))
         ->add($qb->expr()->lte('p.datePublished', ':now'));

并且只处理前两个要求,现在我需要一个条件条目来计算userList中的用户实体数量,而where子句专门用于大于或等于两个用户。

不完全确定在哪里继续..

1 个答案:

答案 0 :(得分:5)

试试这个。该查询使用HAVING仅显示与2个或更多用户关联的实体。

$qb->select($select)
    ->from($this->getEntityName(), 'p')
    ->innerJoin('p.userList','u')
    ->where('p.editor_published = 1')
    ->andWhere('p.datePublished <= :now')
    ->groupBy($select) //not sure what's in $select may need to change this
    ->having('count(u.id) > 1'); //assuming user has an id column otherwise change it
    ->setParameter('now',new \DateTime());