我在将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。
答案 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负责更新。您可能想重新考虑您的设计。