Proxies
Un proxy de Doctrine es solo un contenedor que extiende una clase de entidad para proporcionarle Carga diferida.
De forma predeterminada, cuando le solicita al Administrador de entidades una entidad que está asociada con otra entidad, la entidad asociada no se cargará desde la base de datos, sino que se incluirá en un objeto proxy. Cuando su aplicación luego solicita una propiedad o llama a un método de esta entidad proxed, Doctrine cargará la entidad desde la base de datos (excepto cuando solicite la ID, que siempre es conocida por el proxy).
Esto sucede de forma totalmente transparente para su aplicación debido al hecho de que el proxy extiende su clase de entidad.
Doctrine hidratará de forma predeterminada las asociaciones como proxies de carga diferida si no las JOIN
incluye en su consulta o establece el modo de recuperación en EAGER
.
Ahora debo agregar esto porque no tengo suficiente reputación para comentar en todas partes:
Desafortunadamente, la respuesta de Crozin contiene información errónea.
Si ejecuta una consulta DQL como
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
no obtendrá un objeto de entidad (proxy), sino una matriz asociativa. Por lo tanto, no es posible cargar de forma diferida propiedades adicionales.
Con esto en mente, se llega a la conclusión de que el ejemplo de caso de uso tampoco funcionará. El DQL tendría que cambiarse a algo como esto para poder acceder $article
como objeto:
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
Y la propiedad devuelta por getContent()
tendría que ser una asociación para no cargar las propiedades de contenido de las 25 entidades.
Objetos parciales
Si desea cargar parcialmente propiedades de entidad que no son asociaciones, debe decirle a esta Doctrine explícitamente:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Esto le da un objeto de entidad parcialmente cargado.
¡Pero tenga en cuenta que los objetos parciales no son proxies! La carga diferida no se aplica a ellos. Por lo tanto, el uso de objetos parciales es generalmente peligroso y debe evitarse. Leer más: Objetos parciales - documentación de Doctrine 2 ORM 2