Ich habe ein Problem beim Konvertieren einer SQL-Abfrage in dql. Kann mir jemand helfen.Konvertierung von SQL in DQL
Dies ist, was ich bisher habe:
$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);
Es scheint, wie ich es in subquerys aufspalten müssen oder in mehr querys. Ich bin mir nicht sicher.
Auch es scheint wie es gibt Unterstützung für Update und beitreten in dql.
Ich glaube nicht, Lehre kann 'if' Fällen wie Sie wollen behandeln. Ich würde entweder ORM (dh Ihre "Tree" -Entitätsinstanzen, über ihre Getter/Setter, aber es ist keine flexible wie native SQL für dieses Szenario) oder natives SQL wie hier beschrieben: http://docs.doctrine-project.org /projects/doctrine-orm/en/latest/reference/native-sql.html –
Werfen Sie einen Blick auf Implementierungen von verschachtelten Mengen in doctrine2: https://wildlyinaccurate.com/simple-nested-sets-in-doctrine-2/ –