Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF][Symfony][SF3] SubQuery w LeftJoin
Forum PHP.pl > Forum > PHP > Frameworki
Lirdoner
Cześć, mam takie zapytanie które muszę wywołać w symfony3:
  1. SELECT c.*, cr.rate_date, cr.rate
  2. FROM currency c
  3. LEFT JOIN currency_rate cr ON cr.id = (SELECT MIN(cr2.id) FROM currency_rate cr2 WHERE cr2.currency_id = c.id)


Niestety nie umiem poradzić sobię z subQuery. Mam coś takiego:
  1. $subQuery = $em->getRepository('AppBundle:CurrencyRate')->createQueryBuilder('cr2')
  2. ->select('MIN(cr2.id)')
  3. ->where('cr2.currency_id = c0_.id');
  4.  
  5. $currencies = $em->getRepository('AppBundle:Currency')->createQueryBuilder('c')
  6. ->leftJoin('AppBundle\Entity\CurrencyRate', 'cr', 'with', 'cr.id = :subQuery')->addSelect('cr.rateDate, cr.rate')
  7. ->setParameter(':subQuery', $subQuery->getDQL())
  8. ->getQuery()->getResult();

ale zapytanie które się tworzy to:
  1. SELECT c0_.id AS id_0, c0_.code AS code_1, c0_.active AS active_2, c0_.main AS main_3, c1_.rate_date AS rate_date_4, c1_.rate AS rate_5 FROM currency c0_ LEFT JOIN currency_rate c1_ ON (c1_.id = 'SELECT MIN(cr2.id) FROM AppBundle\\Entity\\CurrencyRate cr2 WHERE cr2.currency_id = c0_.id');

Czyli całe to subQuery jest traktowane jako string. Szukałem odpowiedzi w Google ale żadne rozwiązanie nie zadziałało :/
nospor
No skoro subquery bindujesz jak normalny tekst to masz co masz...

Tak to powinno byc:
https://stackoverflow.com/questions/1076258...763358#10763358
Lirdoner
Okej, tylko, że tutaj jest to robione na where. Moje subQuery jest częścią leftJoin

//edit
Dobra, mam to. Jednak czy istnieje jakaś inna opcja niż wykorzystanie IN?
nospor
1) A co za roznica IN czy = gdy i tak zwracasz tylko jeden rekord w subquery?
2) Poza tym IN to tylko przyklad. Przeciez EXPR posiada rowniez equal czy jakos tak
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.