【发布时间】:2019-09-09 14:00:06
【问题描述】:
我正在尝试根据两个关联表的 SUMed 和 COALESCEd 结果从一个表中查询数据。 该查询在作为本机 SQL 执行时工作正常,不幸的是,我的应用程序仅限于在此处的 QueryBuilder 对象上使用 Doctrine 的 DQL。
这就是我构建 QueryBuilder 的方式:
$resUnitQuery = $queryBuilder->getEntityManager()->createQueryBuilder();
$resUnitQuery->select('COALESCE(SUM(pc.residentialUnits), 0)')
->from(PropertyConnection::class, 'pc')
->where("$rootAlias.id = pc.contract");
$comUnitQuery = $queryBuilder->getEntityManager()->createQueryBuilder();
$comUnitQuery->select('COALESCE(SUM(pwa.residential_units), 0)')
->from(PropertyWithoutAddress::class, 'pwa')
->where("$rootAlias.id = pwa.contract");
$queryBuilder = $this->getEntityManager(Contract::class)->createQueryBuilder();
$queryBuilder
->select('id')
->from(Contract::class, 'o')
->andWhere(
':residentialUnits <= ' .
sprintf(
'((%s) + (%s))',
$resUnitQuery->getQuery()->getDQL(),
$comUnitQuery->getQuery()->getDQL()
)
)
->setParameter('residentialUnits', $params['rangeFrom']);
生成的DQL代码如下:
SELECT id
FROM App\Entity\Contract o
WHERE :residentialUnits <= ((SELECT COALESCE(SUM(pc.residentialUnits), 0) FROM App\Entity\PropertyConnection pc WHERE o.id = pc.contract) + (SELECT COALESCE(SUM(pwa.residential_units), 0) FROM App\Entity\PropertyWithoutAddress pwa WHERE o.id = pwa.contract))
这会导致以下错误:
[Syntax Error] line 0, col 66: Error: Expected Literal, got 'SELECT'
我发现了一个旧的 Doctrine GitHub 问题,指出双括号会导致问题,这就是为什么我在 WHERE 子句中跳过它们并替换了
((%s) + (%s))
与
(%s) + (%s)
原生 SQL 需要使用括号括起来,这也会导致 Doctrine 出错:
[Syntax Error] line 0, col 174: Error: Expected end of string, got '+'
我可能会遇到 Doctrine 的 DQL 的限制吗? 根据文档,支持 SUM 和 COALESCE 以及嵌套查询。
非常感谢,
雷内
【问题讨论】:
标签: php sql-server symfony doctrine