【问题标题】:Doctrine AST custom walkersDoctrine AST 自定义步行者
【发布时间】:2012-11-29 04:44:23
【问题描述】:

我在 Symfony 2 中使用 Doctrine。我有很多共享公共部分的 DQL 查询。我发现,可以使用修改 AST 的 Doctrine 自定义步行器来解决这个问题。以下是我想要完成的示例:

变换

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),但只有一个示例。示例中使用的代码对我来说已经很复杂了,而且我找不到任何其他文档,所以这就是我在这里询问的原因。

谢谢!

【问题讨论】:

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


    【解决方案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 ...);
    

    【讨论】:

    • 是否可以先在 DQL 中编写查询,然后使用查询生成器进行修改?
    • 我不知道,但使用查询生成器确实没有缺点。还有很多优势。
    • 虽然我同意你的观点,但在某些情况下,DQL 可能仍然更具可读性。我会将您的想法用于使用查询生成器进行的查询,但如果我可以对 DQL 查询执行相同的操作,那就太好了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多