Proxies
Ein Doctrine-Proxy ist nur ein Wrapper, der eine Entitätsklasse erweitert, um Lazy Loading dafür bereitzustellen.
Wenn Sie den Entitätsmanager nach einer Entität fragen, die einer anderen Entität zugeordnet ist, wird die zugeordnete Entität standardmäßig nicht aus der Datenbank geladen, sondern in ein Proxy-Objekt eingeschlossen. Wenn Ihre Anwendung dann eine Eigenschaft anfordert oder eine Methode dieser Proxy-Entität aufruft, lädt Doctrine die Entität aus der Datenbank (außer wenn Sie die ID anfordern, die dem Proxy immer bekannt ist).
Dies geschieht für Ihre Anwendung vollständig transparent, da der Proxy Ihre Entitätsklasse erweitert.
Doctrine hydratisiert Assoziationen standardmäßig als Lazy-Load-Proxys, wenn Sie sie nicht JOIN
in Ihrer Abfrage verwenden oder den Abrufmodus auf setzen EAGER
.
Jetzt muss ich das hinzufügen, weil ich nicht genug Ruf habe, um überall zu kommentieren:
Leider enthält Crozins Antwort Fehlinformationen.
Wenn Sie eine DQL-Abfrage wie ausführen
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
Sie erhalten kein (Proxy-) Entitätsobjekt, sondern ein assoziatives Array. Es ist also nicht möglich, zusätzliche Eigenschaften zu laden.
Vor diesem Hintergrund kommt man zu dem Schluss, dass das Anwendungsfallbeispiel auch nicht funktioniert. Die DQL müsste in so etwas geändert werden, um $article
als Objekt zugreifen zu können:
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
Und die von zurückgegebene Eigenschaft getContent()
müsste eine Zuordnung sein, um die Inhaltseigenschaften aller 25 Entitäten nicht zu laden .
Teilobjekte
Wenn Sie Entitätseigenschaften, die keine Assoziationen sind, teilweise laden möchten, müssen Sie diese Doktrin explizit angeben:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Dadurch erhalten Sie ein teilweise geladenes Entitätsobjekt.
Beachten Sie jedoch, dass Teilobjekte keine Proxys sind! Lazy Loading gilt nicht für sie. Daher ist die Verwendung von Teilobjekten im Allgemeinen gefährlich und sollte vermieden werden. Lesen Sie mehr: Teilobjekte - Doctrine 2 ORM 2-Dokumentation