Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] Doctrine i inner join
JoShiMa
post 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?


--------------------
Go to the top of the page
+Quote Post
pyro
post 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
Go to the top of the page
+Quote Post
JoShiMa
post 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


--------------------
Go to the top of the page
+Quote Post
Pilsener
post 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?
Go to the top of the page
+Quote Post
JoShiMa
post 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ę.


--------------------
Go to the top of the page
+Quote Post
Pilsener
post 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:
  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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 09:29