Filtruję samochody po ich wyposażeniu, o ile w phpMyAdmin i nastepującym zapytaniu sql:
SELECT sa.* FROM Samochod JOIN SamochodWyposazenie sw ON sa.id=sw.samochodId JOIN wyposazenie w 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:
return createQueryBuilder('sa') ->join('sa.wyposzenie','w') ->where('w.id IN (:tab)') ->groupBy('sa.id') ->having('COUNT('w.id') = :count') 'tab' => $tab, 'count' => $count)) ->getQuery() ->getResult();
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ąć.