Proxy
Proxy Doctrine chỉ là một trình bao bọc mở rộng một lớp thực thể để cung cấp Lazy Loading cho nó.
Theo mặc định, khi bạn yêu cầu Trình quản lý thực thể cung cấp một thực thể được liên kết với một thực thể khác, thực thể được liên kết sẽ không được tải từ cơ sở dữ liệu mà được gói vào một đối tượng proxy. Khi ứng dụng của bạn yêu cầu một thuộc tính hoặc gọi một phương thức của thực thể được ủy quyền này, Doctrine sẽ tải thực thể từ cơ sở dữ liệu (ngoại trừ khi bạn yêu cầu ID mà proxy luôn biết).
Điều này xảy ra hoàn toàn minh bạch đối với ứng dụng của bạn do proxy mở rộng lớp thực thể của bạn.
Theo mặc định, Doctrine sẽ hydrate hóa các liên kết dưới dạng các proxy tải chậm nếu bạn không có JOIN
chúng trong truy vấn của mình hoặc đặt chế độ tìm nạp thành EAGER
.
Bây giờ tôi phải thêm điều này vì tôi không có đủ danh tiếng để bình luận ở khắp mọi nơi:
Thật không may, câu trả lời của Crozin chứa thông tin sai lệch.
Nếu bạn thực hiện một truy vấn DQL như
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
bạn sẽ không nhận được một đối tượng thực thể (được ủy quyền) mà là một mảng liên kết. Vì vậy, không thể lười tải bất kỳ thuộc tính bổ sung nào.
Với suy nghĩ này, người ta đi đến kết luận rằng ví dụ trường hợp sử dụng cũng sẽ không hoạt động. DQL sẽ phải được thay đổi thành một cái gì đó như thế này để truy cập $article
dưới dạng đối tượng:
SELECT a FROM Entity\Article a ORDER BY a.createdAt DESC LIMIT 25
Và thuộc tính được trả về getContent()
sẽ phải là một liên kết để không tải các thuộc tính nội dung của tất cả 25 thực thể.
Đối tượng một phần
Nếu bạn muốn tải một phần thuộc tính thực thể không phải là liên kết, bạn phải nói rõ ràng với Doctrine này:
SELECT partial u.{id, username} FROM Entity\User u WHERE u.id = :id
Điều này cung cấp cho bạn một đối tượng thực thể được tải một phần.
Nhưng hãy cẩn thận rằng các đối tượng một phần không phải là proxy! Lazy Loading không áp dụng cho họ. Do đó, việc sử dụng các đồ vật một phần nói chung là nguy hiểm và nên tránh. Đọc thêm: Các Đối tượng Một phần - Tài liệu Giáo lý 2 ORM 2