多对多计数大于的 Doctrine 查询生成器
Posted
技术标签:
【中文标题】多对多计数大于的 Doctrine 查询生成器【英文标题】:Doctrine Query Builder Where Count of ManyToMany is greater than 【发布时间】:2014-06-23 18:58:24 【问题描述】:我正在使用 Doctrine Query Builder,并且有一个非常具体的要求。
我在我的实体中使用 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】:试试这个。该查询使用 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());
【讨论】:
嗨!感谢您的回答!我上班时会试一试。这听起来对我来说是不可思议的愚蠢,但我专门使用了多对多原则关系来防止必须编写任何类型的连接之类的东西。不幸的是,这是我唯一的道路吗?此外,我使用 andX() 的东西是因为这个特定的存储库方法有很多复杂的上下文繁重的子句,这些子句建立在这个之上,并且管理什么和在哪里是一个 andWhere 或 orWhere 等变得很麻烦。我只是认为 Doctrine Criteria 条款足够强大,可以做到这一点 如果你想避免加入,你可以通过子查询获得计数,即'(SELECT COUNT(u.id) FROM MyNameSpace\User u WHERE u MEMBER OF p.ul) > 1'
好的,所以我确实一定会以某种“经典”的 mysql 方式来处理问题。老实说,这种情况很糟糕哈哈,有这么多自动魔法在发生,很难不希望有一个更可控的解决方案。我给他们一个机会,谢谢!
希望类似:$criteria->add($qb->expr()->gte($qb->expr()->count('p.userList'), 2))
您在答案中的原始解决方案实际上效果很好。出于某种原因,它必须这样仍然令人失望,但效果是完美的。非常感谢:)以上是关于多对多计数大于的 Doctrine 查询生成器的主要内容,如果未能解决你的问题,请参考以下文章