[Symfony] Doctrine i inner join |
[Symfony] Doctrine i inner join |
1.12.2017, 21:36:37
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
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?
-------------------- |
|
|
1.12.2017, 22:15:05
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) |
Jeżeli pozwolisz - zapytam teoretycznie: a w jaki sposób chciałabyś jeszcze robić joiny :-) ?
-------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
3.12.2017, 20:03:14
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
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. Ten post edytował JoShiMa 3.12.2017, 20:18:57 -------------------- |
|
|
4.12.2017, 08:28:57
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
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? |
|
|
4.12.2017, 20:30:10
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 374 Pomógł: 149 Dołączył: 1.03.2006 Ostrzeżenie: (0%) |
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ę.
-------------------- |
|
|
5.12.2017, 09:06:01
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 590 Pomógł: 185 Dołączył: 19.04.2006 Skąd: Gdańsk Ostrzeżenie: (0%) |
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: - trzeba jeszcze wymusić pobieranie poprzez dodanie select:
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. |
|
|
Wersja Lo-Fi | Aktualny czas: 25.04.2024 - 09:29 |