Doctrine AST定制步行者

时间:2012-12-11 15:49:49

标签: php symfony doctrine abstract-syntax-tree dql

我正在使用Doctrine和Symfony 2.我有很多共享公共部分的DQL查询。我发现,使用Doctrine修改AST的自定义walker可以解决这个问题。以下是我想要完成的一个例子:

变换

SELECT a
FROM AcmeBundle:SomeEntity a
WHERE a.someColumn = 5

SELECT a
FROM AcmeBundle:SomeEntity a
LEFT JOIN a.someOtherEntity b
WHERE a.someColumn = 5 AND (b.someOtherColumn = 2 OR b.someTotallyOtherColumn = 3)

AST walker应添加左连接 - 或多个左连接,并在WHERE部分中添加条件。

我正在阅读文档(http://docs.doctrine-project.org/en/2.0.x/cookbook/dql-custom-walkers.html),但只有一个例子。示例中使用的代码对我来说看起来很复杂,而且我无法找到任何其他文档,所以这就是我在这里要求的原因。

谢谢!

2 个答案:

答案 0 :(得分:1)

请考虑使用查询构建器:

$qb = $entityManager->createQueryBuilder();
$qb->addSelect('a');
$qb->from('AcmeBundle:SomeEntity','a');
$qb->andWhere(... someColumn = 5 ...);

您可以直接执行上述查询,也可以使用以下内容添加更多内容:

$qb->leftJoin('a.someOtherEntity','b');
$qb->andWhere(... additional conditions ...);

答案 1 :(得分:-1)

最近,JetBrains发布了DQL plugin。如果您使用的是PhpStorm,建议您尽可能使用DQL而不是QueryBuilder。 它提供many features(例如语法检查和自动完成),并且支持重构名称。