Proxy
Bir Doctrine proxy'si, bir varlık sınıfını kendisi için Lazy Loading sağlamak üzere genişleten bir sarmalayıcıdır.
Varsayılan olarak, Varlık Yöneticisinden başka bir varlıkla ilişkilendirilmiş bir varlığı sorduğunuzda, ilişkili varlık veritabanından yüklenmez, ancak bir proxy nesnesine sarılır. Uygulamanız daha sonra bir özelliği talep ettiğinde veya bu proxy varlığın bir yöntemini çağırdığında, Doctrine varlığı veritabanından yükleyecektir (her zaman proxy tarafından bilinen kimliği talep ettiğiniz durumlar hariç).
Proxy'nin varlık sınıfınızı genişletmesi nedeniyle bu, uygulamanız için tamamen şeffaf olur.
Doktrin, JOIN
sorgunuzda yoksa veya getirme modunu olarak ayarlamazsanız, ilişkilendirmeleri varsayılan olarak tembel yük vekilleri olarak nemlendirir EAGER
.
Şimdi bunu eklemeliyim çünkü her yerde yorum yapacak kadar itibarım yok:
Ne yazık ki Crozin'in cevabı yanlış bilgiler içeriyor.
Gibi bir DQL sorgusu yürütürseniz
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
bir (vekil) varlık nesnesi değil, ilişkilendirilebilir bir dizi elde edersiniz. Bu nedenle herhangi bir ek özelliği tembel olarak yüklemek mümkün değildir.
Bunu akılda tutarak, kullanım örneği örneğinin de işe yaramayacağı sonucuna varılır. $article
Nesne olarak erişmek için DQL'in böyle bir şeye değiştirilmesi gerekir :
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
Ve tarafından döndürülen getContent()
mülkün, 25 varlığın tümünün içerik özelliklerini yüklememek için bir ilişkilendirme olması gerekir .
Kısmi Nesneler
İlişkilendirme olmayan varlık özelliklerini kısmen yüklemek istiyorsanız, bu Doktrini açıkça belirtmeniz gerekir:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Bu size kısmen yüklenmiş bir varlık nesnesi verir.
Ancak kısmi nesnelerin proxy olmadığına dikkat edin ! Tembel Yükleme onlar için geçerli değildir. Bu nedenle, kısmi nesnelerin kullanılması genellikle tehlikelidir ve bundan kaçınılmalıdır. Daha fazla bilgi edinin: Kısmi Nesneler - Doctrine 2 ORM 2 belgeleri