Proxy
Un proxy Doctrine è solo un wrapper che estende una classe entità per fornire il caricamento lento.
Per impostazione predefinita, quando chiedi a Entity Manager un'entità associata a un'altra entità, l'entità associata non verrà caricata dal database, ma racchiusa in un oggetto proxy. Quando la tua applicazione richiede una proprietà o chiama un metodo di questa entità proxy, Doctrine caricherà l'entità dal database (tranne quando richiedi l'ID, che è sempre noto al proxy).
Ciò è completamente trasparente per la tua applicazione perché il proxy estende la tua classe di entità.
Doctrine idrata per impostazione predefinita le associazioni come proxy di caricamento lento se non vengono JOIN
inseriti nella query o se imposti la modalità di recupero su EAGER
.
Ora devo aggiungere questo perché non ho abbastanza reputazione per commentare ovunque:
Sfortunatamente, la risposta di Crozin contiene disinformazione.
Se esegui una query DQL come
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
non otterrai un oggetto entità (proxy), ma un array associativo. Quindi non è possibile caricare lazy proprietà aggiuntive.
Con questo in mente, si arriva alla conclusione che neanche l'esempio del caso d'uso funzionerà. Il DQL dovrebbe essere cambiato in qualcosa di simile per accedere $article
come oggetto:
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
E la proprietà restituita da getContent()
dovrebbe essere un'associazione per non caricare le proprietà del contenuto di tutte le 25 entità.
Oggetti parziali
Se vuoi caricare parzialmente le proprietà delle entità che non sono associazioni, devi dire esplicitamente a questa Doctrine:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Questo ti dà un oggetto entità parzialmente caricato.
Ma attenzione che gli oggetti parziali non sono proxy! Il caricamento lento non si applica a loro. Pertanto, l'utilizzo di oggetti parziali è generalmente pericoloso e dovrebbe essere evitato. Ulteriori informazioni: Partial Objects - Documentazione di Doctrine 2 ORM 2