如何使用 Doctrine 在 Symfony2 中实现子查询?
Posted
技术标签:
【中文标题】如何使用 Doctrine 在 Symfony2 中实现子查询?【英文标题】:How to implement subqueries in Symfony2 with Doctrine? 【发布时间】:2016-06-06 16:14:46 【问题描述】:我需要计算子查询中返回的项目数。如果我如何编写 DQL 子查询 - 一切都很好,但如果我尝试通过 QueryBuilder 构建查询 - 我会收到错误。
子查询 DQL:
$qb3 = $this->createQueryBuilder('c')
->select('COUNT(c.id)')
->where('c.id IN (SELECT cl.id FROM Acme\AppBundle\Entity\ClassC cl INNER JOIN Acme\AppBundle\Entity\ClassP p WHERE p.var1 = :var1 AND p.var2 = cl.id GROUP BY cl.id)')
->setParameter('var1', $var);
通过 QueryBuilder 进行子查询:
$qb = $this->createQueryBuilder('c');
$qb->select('COUNT(c.id)')
->where(
$qb->expr()->in(
'c.id',
$this->createQueryBuilder('cl')
->select('cl.id')
->innerJoin('Acme\AppBundle\Entity\ClassP', 'p')
->where('p.var1 = :var1')
->setParameter('var1', $var)
->andWhere('p.var2 = cl.id')
->groupBy('cl.id')
->getDQL()
)
);
两个版本都返回相同的 DQL。
错误: screen
【问题讨论】:
【参考方案1】:尝试将setParameter()
移动到主查询级别。
$qb = $this->createQueryBuilder('c');
$qb->select('COUNT(c.id)')
->where(
$qb->expr()->in(
'c.id',
$this->createQueryBuilder('cl')
->select('cl.id')
->innerJoin('Acme\AppBundle\Entity\ClassP', 'p')
->where('p.var1 = :var1')
->andWhere('p.var2 = cl.id')
->groupBy('cl.id')
->getDQL()
)
)
->setParameter('var1', $var);
【讨论】:
以上是关于如何使用 Doctrine 在 Symfony2 中实现子查询?的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2/Doctrine:如何使用 OneToMany 将实体重新保存为级联新行
Symfony2/Doctrine:如何从实体类中持久化一个实体?
Symfony2/Doctrine - 与普通 SQL 相关的实体抽象