Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][SF2][Symfony2]Zapytanie dql dotyczące relacji ManyToMany
Forum PHP.pl > Forum > PHP > Frameworki
Crash89
Próbuję zrobić zapytanie pobierające przefiltrowane wartości z bazy danych.

Filtruję samochody po ich wyposażeniu, o ile w phpMyAdmin i nastepującym zapytaniu sql:
  1. SELECT sa.* FROM Samochod JOIN SamochodWyposazenie sw ON sa.id=sw.samochodId JOIN wyposazenie w
  2. ON sw.wyposazenieId=w.id WHERE ws.wyposazenieId IN (1,2) GROUP BY sa.id HAVING COUNT(ws.wyposazenieId = 2)


Działa prawidłowo i zwraca prawidłowe wyniki, to kiedy próbuję to przerzucić na dql a dokładniej do createQueryBuilder, niestety nie zwraca mi prawidłowych wyników.
Głównym problemem jest tutaj brak możliwości połaczenia tabeli joinem z tabelą SamochódWyposażenie, nie ma też możliwości odniesienia się do tabeli w klasie entity samochód -> wyposażenie.
Mój kod na ten moment wygląda następująco:

  1. return createQueryBuilder('sa')
  2. ->join('sa.wyposzenie','w')
  3. ->where('w.id IN (:tab)')
  4. ->groupBy('sa.id')
  5. ->having('COUNT('w.id') = :count')
  6. ->setParameters(array(
  7. 'tab' => $tab,
  8. 'count' => $count))
  9. ->getQuery()
  10. ->getResult();
  11.  



Niestety to zapytanie dql zwraca nie poprawne wyniki, a mianowicie nie grupuje chyba wyników po sa.id i zwraca rekordy nawet te których suma wejściowa jest mniejsza lub różna od $count.
Tablica tab to tablica wynikowa pobrana z checkboxa, które zaznaczył użytkownik a zmienna count to jej wielkość.
Czy istnieje możliwość w dqlu żeby połączyć joinem z relacją samochodwyposażenie dla relacji ManyToMany? Gdy tak próbuję zrobić joinem ->join(sa.samochódwyposazenie) Wypisuje mi, że nie ma takiej relacji.
Drugie pytanie, w tabeli samochód istnieje tablica $wyposazenie, która jest użyta do łączenia ManyToMany między tabelami, i czy tą zmienną można użyć w dqlu?

Pewnie rozwiązaniem będzie ręczne utworzenie tabeli SamochodWyposazenie i łączenie jej z resztą tabel relacjami ManyToOne, ale jeśli jest taka możliwość wolałbym tego uniknąć.
prz3kus
Jak masz problemy z rozbudowanym zapytaniem (doctrine jest uniwersalny przez co QueryBuldier ma ograniczenia) to skorzystaj z natywnego zapytania.

http://doctrine-orm.readthedocs.org/en/lat...native-sql.html

Tam masz pełne pole do popisu, tylko trzba pola zmapować.
Crash89
Miałem jakiś błąd w mapowaniu, dlatego nie działało.
Ale dzięki za informacje które podałeś, na pewno się przyda.
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.