2016-12-12 5 views
-2

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.

+3

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 –

+0

Werfen Sie einen Blick auf Implementierungen von verschachtelten Mengen in doctrine2: https://wildlyinaccurate.com/simple-nested-sets-in-doctrine-2/ –

Antwort

0

Sie können CASE anstelle von IF verwenden oder Sie können Ihre eigene benutzerdefinierte IF DQL-Funktion erstellen. Wenn du ein wenig gesucht hättest, hättest du wahrscheinlich schon deine Antwort gefunden.

Hier ist ein Beitrag, der jene beschreibt: wie das Richtige mit Converting MySQL to Doctrine Query Builder. Issues with IF and CONCAT. Or another approach for subqueries on select

Auch UPDATE in Ihrer Lehre Abfrage scheint nicht da in der Regel zu tun Lehre Pflege Updates nimmt. Vielleicht möchten Sie Ihr Design überdenken.