2013-08-10 3 views
15

Ich versuche, eine einfache SELECT-Abfrage mit einer Unterabfrage in der SELECT-Klausel zu tun und habe einfach keine Möglichkeit gefunden, es zu tun. Ich habe sowohl mit DQL als auch mit dem QueryBuilder versucht, beide funktionieren nicht. Der Code folgt, bitte sagen Sie nicht, ich könnte nur einen Join verwenden, dies ist ein vereinfachtes Beispiel, nur um das Problem zu veranschaulichen, habe ich legitime Anwendungsfälle für Unterabfragen.Doktrin 2: Wie verwenden Sie eine Unterabfrage-Spalte (in der SELECT-Klausel)

// With QueryBuilder 
$query = $qb->select(array('a', 
          '(SELECT at.addresstypeName 
           FROM e:Addresstype at 
           WHERE at.addresstypeId = a.addresstypeId 
          ) AS addresstypeName')) 
      ->from('e:Address', 'a') 
      ->where('a.addressId = :addressId') 
      ->setParameter('addressId', 1); 

// With DQL 
$dql = "SELECT a, 
       (SELECT at.addresstypeName 
        FROM e:Addresstype at 
       WHERE at.addresstypeId = a.addresstypeId 
       ) AS addresstypeName 
      FROM e:Address a 
     WHERE a.addressId = :addressId"; 
$query = $em->createQuery($dql)->setParameter(':addressId', 1); 

die folgende Beziehung auf der Adresstabelle definiert ist:

/** 
* @ORM\ManyToOne(targetEntity="Addresstype") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="addresstype_id", referencedColumnName="addresstype_id") 
* }) 
*/ 
protected $addresstype; 

In nativen SQL würde die Abfrage wie folgt aussehen:

SELECT 
    a.*, 
    (
     SELECT at.addresstype_name 
     FROM addresstype at 
     WHERE at.addresstype_id = a.addresstype_id 
    ) AS addresstype_name 
FROM address a 
WHERE a.address_id = 1 

Irgendwelche Ideen?

Antwort

16
$query = $qb->select('a') 
    ->addSelect('(SELECT at.addresstypeName 
      FROM e:Addresstype at 
      WHERE at.addresstypeId = a.addresstypeId) AS addresstypeName' 
     ) 
    ->from('e:Address', 'a') 
    ->where('a.addressId = :addressId') 
    ->setParameter('addressId', 1); 
+0

Gerade versucht es, bekomme ich die Folgefehler: [Semantischer Fehler] Zeile 0, Spalte 112 in der Nähe von 'addresstypId': Fehler: Klasse NP \ entities \ Adresse hat kein Feld oder Assoziation mit dem Namen addresstypeId Sinnvoll, da addresstypId niemals in der Addressentity definiert wird, nur die Beziehung, Daher müssen Sie normalerweise keine Fremdschlüssel verwenden. – Rocket04

+0

Ich kopiere einfach deine Unterabfrage, um deine Frage zu beantworten. Ich kann diese Unterabfrage nicht mit Informationen über Ihre Entitäten (und das Schema) reparieren. Es ist am besten, wenn Sie die echte Abfrage entweder mit dem richtigen Schema veröffentlichen. Ihre Frage "Wie verwende ich eine Unterabfrage-Spalte?" Wurde beantwortet, bitte akzeptieren. Ich werde versuchen, Ihnen beim Schreiben einer guten Unterabfrage zu helfen (das ist eine andere Frage). – Flip

+0

Ich habe die Details des Schemas hinzugefügt. Ich denke, es wäre erwähnenswert gewesen, dass da eine Beziehung war. – Rocket04

9

Für mich Subquery mit Lehre arbeitet mit dieser Abfrage:

$qb->select('e.field') 
    ->addSelect('(SELECT count(mv.nm) 
       FROM Clt\Bundle\MyBundle\Entity\MV mv 
       LEFT JOIN Clt\Bundle\MyBundle\Entity\M ma WITH mv.nm=ma.nm 
       WHERE mv.ne=e.ne and ma.nm is null 
       ) AS nm' 
    ) 
    ->from($this->_entityName, 'e') 
    ->leftJoin('e.m', 'm') 
    ->where($qb->expr()->eq('t.id'.$typeModule, $idElementModule)); 

Beachten Sie, dass join im linken Sie MIT statt ON verwenden müssen ...

Verwandte Themen