Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Doctrine i inner join
Forum PHP.pl > Forum > PHP > Frameworki
JoShiMa
Uczę się dopiero Doctrine i zastanawia mnie jedno. Czy inner join tabel, które mają zdefiniowaną relację OneToMany daje się osiągnąć jedynie poprzez querybuilder?
pyro
Jeżeli pozwolisz - zapytam teoretycznie: a w jaki sposób chciałabyś jeszcze robić joiny :-) ?
JoShiMa
Teoretycznie to się to na ogół robi poprzez definicję relacji między encjami (OneToMany) która odpowiada relacjom w bazie danych (klucze obce) (https://symfony.com/doc/current/doctrine/associations.html).

Jesli się mylę to mnie popraw. Dopiero się uczę Symfony.
Pilsener
Powinno się używać w kolejności:
- selectable (czyli $user->getEmails())
- criteria
- query builder
- dql
- native query

Czyli jak chcesz zrobić joina do tabeli, gdzie nie masz zdefiniowanych relacji to trzeba użyć query buildera, dql lub czystego sqla. Jak są relacje można zrobić joina "ręcznie" - ale po co?
JoShiMa
Po to, że chcę mieć inner join a jak są relacje zdefiniowane to uruchamia się lazy loading i jak nie ma powiązanych rekordów dostaję nulle których nie chcę.
Pilsener
W takim razie problemem raczej jest sposób hydrowania danych, można to rozwiązać na dwa sposoby:

1. Użyć odpowiedniej adnotacji (LAZY, EAGER lub EXTRA LAZY), więcej np. tutaj: http://docs.doctrine-project.org/projects/...sociations.html i to się sprawdzi jeśli wiemy, że np. wraz z obiektem User zawsze będziemy potrzebowali kolekcji emaili (wtedy ustawiamy na EAGER)

2. Jeśli sposób hydrowania jest zależny od kontekstu, to nie ma innego (wygodnego) wyjścia jak użyć query buildera. Jednak nie wystarczy:
  1. $qb->join('u.emails', 'e');
- trzeba jeszcze wymusić pobieranie poprzez dodanie select:

  1. $qb->select('u', 'e');

W ten sposób emaile zawsze będą w user niezależnie od tego, czy są potrzebne czy nie.

Więcej nie da się powiedzieć bo nie znam Twojego kodu, równie dobrze problemem mogą być źle zaprojektowane encje.
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.