Proxy
Proxy Doctrine to po prostu opakowanie, które rozszerza klasę jednostki, aby zapewnić jej Lazy Loading.
Domyślnie, gdy poprosisz Entity Manager o jednostkę, która jest skojarzona z inną jednostką, skojarzona jednostka nie zostanie załadowana z bazy danych, ale zostanie opakowana w obiekt proxy. Gdy aplikacja zażąda następnie właściwości lub wywoła metodę tej jednostki proxy, Doctrine załaduje jednostkę z bazy danych (z wyjątkiem sytuacji, gdy zażądasz identyfikatora, który jest zawsze znany proxy).
Dzieje się to w pełni przezroczyste dla aplikacji ze względu na fakt, że serwer proxy rozszerza klasę jednostki.
Doctrine domyślnie nawadnia asocjacje jako serwery proxy z leniwym ładowaniem, jeśli JOIN
ich nie uwzględnisz w zapytaniu lub ustawisz tryb pobierania na EAGER
.
Teraz muszę to dodać, ponieważ nie mam wystarczającej reputacji, aby komentować wszędzie:
Niestety odpowiedź Crozina zawiera dezinformację.
Jeśli wykonujesz zapytanie DQL, takie jak
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
nie otrzymasz (zastępowanego) obiektu encji, ale tablicę asocjacyjną. Dlatego nie można leniwie ładować żadnych dodatkowych właściwości.
Mając to na uwadze, dochodzi się do wniosku, że przykład użycia również nie zadziała. Aby uzyskać dostęp $article
jako obiekt, należałoby zmienić DQL na coś takiego :
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
Właściwość zwracana przez getContent()
musiałaby być asocjacją, aby nie ładować właściwości treści wszystkich 25 jednostek.
Częściowe obiekty
Jeśli chcesz częściowo załadować właściwości encji, które nie są skojarzeniami, musisz wyraźnie powiedzieć tej Doktrynie:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Daje to częściowo załadowany obiekt encji.
Ale uważaj, że częściowe obiekty nie są proxy! Leniwe ładowanie ich nie dotyczy. Dlatego używanie częściowych przedmiotów jest generalnie niebezpieczne i należy go unikać. Czytaj więcej: Częściowe obiekty - dokumentacja Doctrine 2 ORM 2