是否可以将DQL查询构建器转换为查询构建器?

时间:2017-10-06 22:19:55

标签: symfony doctrine-orm doctrine

我有一个树结构,它由Gedmo\Tree管理。我想对子树中的一个字段进行复杂更新,此更新需要与另一个表连接,DQL不支持它。所以我希望通过Gedmo\Tree存储库方法childrenQueryBuilder获取DQL构建器,将其转换为QueryBuilder并添加更新语句。

$dqlQueryBuilder = $repository->childrenQueryBuilder($node, ...);
$dqlQueryBuilder->resetDQLParts(['select', 'orderBy']);
$queryBuilder = convert($dqlQueryBuilder);
$queryBuilder->leftJoin('...', 'lj');
$queryBuilder->update('node.update', 'concat(node.field, lj.field)');

我知道我可以编写自定义QueryBuilder,我只是想知道这些转换是否可以通过doctrine内置工具或一些第三方库来实现。

1 个答案:

答案 0 :(得分:0)

在Doctrine中没有SQLQueryBuilder这样的东西,只有QueryBuilder这是一个DQL查询生成器。您可以做的是通过执行

DQL转换为SQL
$stringSql = $queryBuilder->getQuery()
    ->getSQL();

一旦拥有它,您可以使用本机sql,然后将其作为原始sql执行。

注意:我不确定您的意思是什么确切的数据库特定声明,但是可以通过使用FunctionNode将数据库特定功能映射到DQL类。将函数映射到DQL之后,您可以仅使用DQL完成它。

检查documentation如何在DQL中使用自定义数据库功能