2013-08-10 8 views
15

Sto provando a fare una semplice query di selezione con una sottoquery nella clausola SELECT e semplicemente non ho trovato un modo per farlo. Ho provato sia con DQL che con QueryBuilder, né lavoro. Il codice segue, per favore non dire che potrei semplicemente usare un join, questo è un esempio semplificato solo per illustrare il problema, ho casi d'uso legittimi per le subquery.Doctrine 2: come si usa una colonna di sottoquery (nella clausola SELECT)

// 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); 

la seguente relazione è definita nella tabella Indirizzo:

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

In SQL nativo, la query sarebbe simile a questa:

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 

Tutte le idee?

risposta

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

appena provato, ho la errore seguente: [Errore semantico] riga 0, colonna 112 vicino 'addresstypeId': Errore: Classe NP \ entità \ Indirizzo non ha campo o associazione denominata addresstypeId Ha senso poiché il tipo di indirizzo non viene mai definito sull'entità Indirizzo, solo la relazione, quindi di solito non devi mai usare le chiavi esterne. – Rocket04

+0

Copia semplicemente incolla la subquery per rispondere alla tua domanda. Non riesco a correggere questa subquery senza informazioni sulle entità (e sullo schema). È meglio se pubblichi la vera query con lo schema reale in ogni caso. La tua domanda "come usare una colonna di subquery" è stata esaudita, per favore accetta. Cercherò di aiutarti a scrivere una buona sottoquery (questa è un'altra domanda). – Flip

+0

Ho aggiunto i dettagli dello schema. Immagino che sarebbe valso la pena menzionare che c'era una relazione lì dentro. – Rocket04

9

Per me subquery con la dottrina lavora con questa query:

$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)); 

Si noti che nella sinistra si uniscono è necessario utilizzare CON invece che su ...

Problemi correlati