Proxies
Um proxy Doctrine é apenas um wrapper que estende uma classe de entidade para fornecer Lazy Loading para ela.
Por padrão, quando você pede ao Entity Manager por uma entidade que está associada a outra entidade, a entidade associada não será carregada do banco de dados, mas empacotada em um objeto proxy. Quando seu aplicativo então solicita uma propriedade ou chama um método desta entidade com proxy, o Doctrine irá carregar a entidade do banco de dados (exceto quando você solicitar o ID, que é sempre conhecido pelo proxy).
Isso acontece de forma totalmente transparente para o seu aplicativo devido ao fato de que o proxy estende sua classe de entidade.
O Doctrine irá, por padrão, hidratar as associações como proxies de carregamento lento se você não JOIN
os fizer em sua consulta ou definir o modo de busca para EAGER
.
Agora devo acrescentar isso porque não tenho reputação suficiente para comentar em todos os lugares:
Infelizmente, a resposta de Crozin contém informações incorretas.
Se você executar uma consulta DQL como
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
você não obterá um objeto de entidade (com proxy), mas uma matriz associativa. Portanto, não é possível carregar lentamente nenhuma propriedade adicional.
Com isso em mente, chega-se à conclusão de que o exemplo de caso de uso também não funcionará. O DQL teria que ser alterado para algo assim para acessar $article
como objeto:
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
E a propriedade retornada por getContent()
teria que ser uma associação para não carregar as propriedades de conteúdo de todos 25 entidades.
Objetos Parciais
Se você deseja carregar parcialmente as propriedades da entidade que não são associações, você deve informar esta Doutrina explicitamente:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Isso fornece um objeto de entidade parcialmente carregado.
Mas cuidado, pois objetos parciais não são proxies! O Lazy Loading não se aplica a eles. Portanto, usar objetos parciais é geralmente perigoso e deve ser evitado. Leia mais: Objetos Parciais - Doctrine 2 ORM 2 documentação