2013-08-10 12 views
15

Próbuję zrobić proste zapytanie z podzapytaniem w klauzuli SELECT i po prostu nie znalazłem sposobu, aby to zrobić. Próbowałem zarówno z DQL i QueryBuilder, ani pracy. Poniższy kod, proszę nie mówić, że mogę po prostu użyć join, jest to uproszczony przykład tylko zilustrować problem, mam legalne przypadki użycia podkwerend.Doctrine 2: w jaki sposób używasz kolumny podkwerendy (w klauzuli 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); 

następującą zależność jest określona w tabeli Adres:

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

w natywnym SQL, zapytanie będzie wyglądać następująco:

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 

pomysłów?

Odpowiedz

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

prostu próbowałem go, otrzymuję następujący błąd: [Błąd semantyczny] linia 0, col 112 w pobliżu 'addresstypeId)': Błąd: Klasa NP \ podmioty \ Adres nie ma pola lub asocjacji o nazwie AddresspypeId Ma sens, ponieważ typ adresu nigdy nie jest zdefiniowany w encji Adres, tylko relacja, więc zwykle nie musisz używać obcych kluczy. – Rocket04

+0

Po prostu kopiuj wklej swoje podkwerendy, aby odpowiedzieć na twoje pytanie. Nie mogę naprawić tego podkwerendy bez informacji o twoich jednostkach (i schemacie). Najlepiej, jeśli zamieścisz prawdziwe zapytanie z rzeczywistym schematem. Twoje pytanie "jak używać kolumny podkwerendy" zostało odebrane, proszę zaakceptuj. Postaram się pomóc ci napisać dobre podkwerendy (to jest kolejne pytanie). – Flip

+0

Dodałem szczegóły schematu. Sądzę, że warto byłoby wspomnieć o tamtejszej relacji. – Rocket04

9

Dla mnie podzapytanie z doktryną działa z tej kwerendy:

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

Zauważ, że w LEFT JOIN należy użyć Z zamiast ON ...

Powiązane problemy