ผู้รับมอบฉันทะ
Doctrine proxy เป็นเพียงกระดาษห่อหุ้มที่ขยายคลาสเอนทิตีเพื่อให้ Lazy Loading สำหรับมัน
โดยค่าเริ่มต้นเมื่อคุณขอให้ผู้จัดการเอนทิตีสำหรับเอนทิตีที่เชื่อมโยงกับเอนทิตีอื่นเอนทิตีที่เกี่ยวข้องจะไม่ถูกโหลดจากฐานข้อมูล แต่รวมอยู่ในวัตถุพร็อกซี เมื่อแอปพลิเคชันของคุณร้องขอคุณสมบัติหรือเรียกใช้เมธอดของเอนทิตีพร็อกซีนี้ Doctrine จะโหลดเอนทิตีจากฐานข้อมูล (ยกเว้นเมื่อคุณร้องขอ ID ซึ่งพร็อกซีจะรู้เสมอ)
สิ่งนี้เกิดขึ้นอย่างโปร่งใสกับแอปพลิเคชันของคุณเนื่องจากพร็อกซีขยายคลาสเอนทิตีของคุณ
หลักคำสอนจะโดยสมาคมมือไม่ถึงเริ่มต้นเป็นผู้รับมอบฉันทะโหลดขี้เกียจถ้าคุณทำไม่ได้พวกเขาในการค้นหาของคุณหรือตั้งค่าโหมดการดึงข้อมูลJOIN
EAGER
ตอนนี้ฉันต้องเพิ่มสิ่งนี้เพราะฉันไม่มีชื่อเสียงมากพอที่จะแสดงความคิดเห็นได้ทุกที่:
น่าเสียดายที่คำตอบของ Crozin มีข้อมูลที่ผิด
หากคุณเรียกใช้แบบสอบถาม DQL เช่น
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
คุณจะไม่ได้รับวัตถุเอนทิตี (proxied) แต่เป็นอาร์เรย์ที่เชื่อมโยง ดังนั้นจึงไม่สามารถขี้เกียจโหลดคุณสมบัติเพิ่มเติมใด ๆ
ด้วยเหตุนี้จึงมีข้อสรุปว่าตัวอย่างกรณีการใช้งานจะไม่ทำงานเช่นกัน DQL จะต้องเปลี่ยนเป็นแบบนี้เพื่อเข้าถึง$article
เป็นวัตถุ:
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
และคุณสมบัติที่ส่งคืนโดยgetContent()
จะต้องมีการเชื่อมโยงเพื่อไม่ให้โหลดคุณสมบัติเนื้อหาของทั้ง 25 เอนทิตี
วัตถุบางส่วน
หากคุณต้องการโหลดคุณสมบัติของเอนทิตีบางส่วนที่ไม่ใช่การเชื่อมโยงคุณต้องบอกหลักคำสอนนี้อย่างชัดเจน:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
สิ่งนี้ทำให้คุณมีอ็อบเจ็กต์เอนทิตีที่โหลดบางส่วน
แต่ระวังว่าวัตถุบางส่วนไม่ใช่พร็อกซี! Lazy Loading ใช้ไม่ได้กับพวกเขา ดังนั้นโดยทั่วไปการใช้วัตถุบางส่วนจึงเป็นอันตรายและควรหลีกเลี่ยง อ่านเพิ่มเติม: Partial Objects - เอกสารหลักคำสอน 2 ORM 2