Proxies
Un proxy Doctrine n'est qu'un wrapper qui étend une classe d'entité pour lui fournir un chargement différé.
Par défaut, lorsque vous demandez au Gestionnaire d'entités une entité associée à une autre entité, l'entité associée ne sera pas chargée à partir de la base de données, mais encapsulée dans un objet proxy. Lorsque votre application demande alors une propriété ou appelle une méthode de cette entité mandatée, Doctrine chargera l'entité à partir de la base de données (sauf lorsque vous demandez l'ID, qui est toujours connu du proxy).
Cela se produit de manière totalement transparente pour votre application du fait que le proxy étend votre classe d'entité.
Doctrine hydrate par défaut les associations en tant que proxys de chargement différé si vous ne les faites pas JOIN
dans votre requête ou si vous définissez le mode de récupération sur EAGER
.
Maintenant, je dois ajouter ceci car je n'ai pas assez de réputation pour commenter partout:
Malheureusement, la réponse de Crozin contient de la désinformation.
Si vous exécutez une requête DQL comme
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
vous n'obtiendrez pas un objet entité (mandaté), mais un tableau associatif. Il n'est donc pas possible de charger paresseusement des propriétés supplémentaires.
Dans cet esprit, on arrive à la conclusion que l'exemple de cas d'utilisation ne fonctionnera pas non plus. Le DQL devrait être changé en quelque chose comme ceci afin d'accéder en $article
tant qu'objet:
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
Et bien retourné par getContent()
devrait être une association afin de ne pas charger les propriétés de contenu de toutes les 25 entités.
Objets partiels
Si vous souhaitez charger partiellement des propriétés d'entité qui ne sont pas des associations, vous devez indiquer explicitement cette doctrine:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Cela vous donne un objet entité partiellement chargé.
Mais attention, les objets partiels ne sont pas des proxies! Le chargement différé ne s'applique pas à eux. Par conséquent, l'utilisation d'objets partiels est généralement dangereuse et doit être évitée. En savoir plus: Objets Partiels - Documentation Doctrine 2 ORM 2