Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][Symfony]Join bez użycia Relacji na Encjach
Forum PHP.pl > Forum > PHP > Frameworki
adbacz
Mam dwie tabele: crew oraz crew_player. Player jest przypisany do Crew poprzez ID, a Crew należy do jakiegoś użytkownika. Potrzebuję wykonać poniższe zapytanie SQL za pomocą Doctrine, jednak nie zadziała to bez zrobienia relacji w encjach. A jeśli zrobię relacje, to Doctrine pobierze mi niepotrzebnie rekord z tabeli crew, który jest mi niepotrzebny. Jak w takim razie można to obejść, bym mógł pobrać tylko rekord z tabeli crew_player?

  1. SELECT p.*
  2. FROM player p
  3. INNER JOIN player_crew c
  4. ON ( p.crew_id = c.id )
  5. WHERE ( c.owner = "$userId" )
  6. LIMIT 1

(zapytanie podglądowe, nie sprawdzałem jego działania)
Forti
Co znaczy "pobierze nie potrzebne dane"? Jak nie zrobisz join to nie pobierze.

Doctrine jest ograniczony (DQL). Albo zrób to w nativ SQL albo pogódź się z tym że musisz mieć zmapowaną relacje. To twoje inner join ... on ... się nie sprawdzi ponieważ wywali błąd - musi być WITH i wówczas będziesz musiał ręcznie mapować, ponieważ otrzymasz coś takiego:

  1. $result = [
  2. 0 => [
  3. 'name' => 'nazwa',
  4. 'joined_record' => 1
  5. ],
  6. 1 => [
  7. 'name' => 'tutaj bedzie joined_record'
  8. ]
  9. ];


Mam nadzieje że rozumiesz wink.gif Sam się sporo z tym męczyłem i tego nie przeskoczysz. Albo SQL albo relacja.
adbacz
Pierwsze słysze o użyciu WITH w zapytaniu. Co w podanym przeze mnie przykładzie wyrzuci błąd? Od zawsze robię takie w tym kontekście i nie miałem z nimi problemu.

Podczas używania Native SQL można podpiąć Encję Doctrine jako rezultat zapytania, by zwróciło kolekcję obiektów zamiast kolekcji tablic?
Forti
jakoś tak:

  1. $queryBuilder = $this->getEntityManager()
  2. ->createQueryBuilder()
  3. ->select('c')
  4. ->from('AcmeVideoBundle:Video', 'v')
  5. ->join('AcmeCategoryBundle:Category', 'c', Expr\Join::WITH, 'v.id = c.id')
  6. ->groupBy('c.id')


zamiast Expr\Join::WITH string 'WITH' również działa. Jak ustawisz 'ON' dostaniesz błąd. Gwarantuje.

edit:
nie pamiętam dokładniej treści błędu. Być może coś mieszam i jakoś to się da - z tym że na stackach wszędzie przykłady są z WITH. Błąd brzmiał mniej więcej: "unexpected ON, expected WITH"
adbacz
Ja sądziłem, że WITH zrobić w Native SQl a nie w QueryBuilder i stąd to niezrozumienie. Dziękuję za przykład, wszystko działa jak chciałem.
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.