将sql转换为dql

时间:2016-12-12 14:43:11

标签: doctrine-orm symfony

我在将sql查询转换为dql时遇到问题。 任何人都可以帮助我。

这是我到目前为止所得到的:

$query = $this->em->createQuery("
        UPDATE MyBundle:Tree AS n
        JOIN MyBundle:Tree AS movingNode ON movingNode.id = :node
        JOIN MyBundle:Tree AS parentNode ON parentNode.id = :parent
        SET
        n.lft = n.lft +
            IF (parentNode.lft < movingNode.lft,
                 IF (n.lft >= movingNode.rgt + 1, 0,
                        IF (n.lft >= movingNode.lft, parentNode.lft - movingNode.lft + 1,
                                IF (n.lft >= parentNode.lft + 1, movingNode.rgt - movingNode.lft + 1 , 0
                                    )
                            )
                     ),
                 IF (n.lft >= parentNode.lft + 1, 0,
                        IF (n.lft >= movingNode.rgt + 1, -movingNode.rgt + movingNode.lft - 1,
                                IF (n.lft >= movingNode.lft, parentNode.lft - movingNode.rgt, 0
                                    )
                            )
                     )
                ),
        n.rgt = n.rgt +
            IF (parentNode.lft < movingNode.lft,
                 IF (n.rgt >= movingNode.rgt + 1, 0,
                        IF (n.rgt >= movingNode.lft, parentNode.lft - movingNode.lft + 1,
                                IF (n.rgt >= parentNode.lft + 1, movingNode.rgt - movingNode.lft + 1 , 0
                                    )
                            )
                     ),
                 IF (n.rgt >= parentNode.lft + 1, 0,
                        IF (n.rgt >= movingNode.rgt + 1, -movingNode.rgt + movingNode.lft - 1,
                                IF (n.rgt >= movingNode.lft, parentNode.lft - movingNode.rgt, 0
                                    )
                            )
                     )
                )
        WHERE parentNode.lft < movingNode.lft OR parentNode.lft > movingNode.rgt;
    ")->setParameter('node', $node)->setParameter('parent', $parent);

似乎我需要将其拆分为subquerys或更多的查询。我不舒服。

此外,似乎支持更新和加入dql。

1 个答案:

答案 0 :(得分:0)

您可以使用CASE代替IF,也可以创建自己的自定义IF DQL功能。如果你做了一些搜索,你可能已经找到了答案。

这是一篇描述这些内容的帖子: Converting MySQL to Doctrine Query Builder. Issues with IF and CONCAT. Or another approach for subqueries on select

此外,在您的Doctrine查询中使用UPDATE似乎不是正确的事情,因为通常Doctrine负责更新。您可能想重新考虑您的设计。