使用 Doctrine ORM 的顶级 EXISTS 查询

Top level EXISTS query using Doctrine ORM

我有这样一个简单的查询 SQL(当然原来的更复杂,但仍然很简单,我很确定至少那部分是正确的):

SELECT EXISTS (SELECT 1 FROM mytable WHERE 1 = 1)

问题是:如何使用 Doctrine ORM DQL 执行此操作?

我目前的状态如下:

$queryBuilder = $this->em->createQueryBuilder();
$subQueryBuilder = $this->em->createQueryBuilder();

$subQueryBuilder
    ->select('1')
    ->from(MyEntity::class, 'b')
    ->where($subQueryBuilder->expr()->eq('1', '1'))
;

return (bool) $queryBuilder
    ->select('EXISTS(' . $subQueryBuilder->getDQL() . ')')
    ->getQuery()
    ->getSingleScalarResult()
;

这将抛出一个解析错误,因为 EXISTS 是一个未知函数(并且没有内置函数来覆盖它)。使用本机查询也不起作用,但我可能搞砸了,所以非常感谢包含结果集映射的正确示例。

SO 上有类似问题的答案,但我还没有找到确切的问题。

感谢您的帮助!

好吧,尽管感觉有点不对,但我还是通过使用本机查询解决了这个问题。仅供参考(但仍有待改进):

$subQueryBuilder = $this->em->createQueryBuilder();

$subQueryBuilder
    ->select('1')
    ->from(MyEntity::class, 'b')
    ->where($subQueryBuilder->expr()->eq('foo', '?'))
;

$rsm = new ResultSetMappingBuilder($this->em);
$rsm->addScalarResult('x', 'x', 'boolean');

$query = $this->em
    ->createNativeQuery('SELECT EXISTS(' . $subQueryBuilder->getQuery()->getSQL() . ') as x', $rsm)
;

return (bool) $query
    ->setParameter(1, 'bar')
    ->getSingleScalarResult()
;