【发布时间】:2017-04-29 16:12:05
【问题描述】:
我想就使用QueryBuilder 构建的Doctrine2 DBAL 查询寻求您的帮助。我习惯了 ORM,但我认为对于在侦听器中调用的此类查询来说,这有点过头了。
我需要使用 SELECT EXISTS 进行查询,但我不知道如何使用 DBAL QueryBuilder 构造它。
我已经创建了一个子查询:
$subQuery = $connection->createQueryBuilder();
$subQuery
->select('o.id')
->from('order', 'o')
->leftJoin('o', 'payment', 'p')
->where($subQuery->expr()->isNull('p.id'))
;
我基本上是想检查是否有任何未付款的订单。我现在不知道如何构建SELECT EXISTS 查询?谁能指出我正确的方向?我在想这样的事情:
$qb->select('EXISTS(?)')->setParameter($subQuery->getDQL())
这会是正确的解决方案吗?
@编辑
经过一段时间的思考,我决定改用 ORM。不幸的是,这也不起作用,我收到一个错误:
line 0, col 7: Error: Expected known function, got 'EXISTS'
DQL 是:
SELECT EXISTS(<subquery here>)
考虑到它是用 QueryBuilder 构建的,这有点奇怪:
/* @var $qb QueryBuilder */
$qb = $this->em->createQueryBuilder();
$qb
->select($qb->expr()->exists($subQuery->getDQL()));
【问题讨论】:
-
不幸的是,这是 ORM,我需要 DBAL,它没有“exists()”表达式。而且我必须避免编写简单的 SQL。
-
这解释了如何将 EXISTS 添加到 DQL:docs.doctrine-project.org/projects/doctrine-orm/en/latest/… 周围有几个这样的用户定义函数包,因此您可能会在某个地方找到实现。可惜你不能只使用 sql。