Chỉnh sửa 2013.02.17:
Điều tôi viết dưới đây không còn đúng nữa. Bạn không phải làm bất cứ điều gì trong kịch bản được nêu trong câu hỏi, vì Doctrine đủ thông minh để tải các trường id vào các thực thể liên quan, vì vậy các đối tượng proxy sẽ chứa id và nó sẽ không đưa ra một cuộc gọi nào khác kho dữ liệu.
Câu trả lời lỗi thời bên dưới:
Có thể, nhưng không được khuyến khích. Lý do đằng sau đó là Doctrine cố thực sự tuân thủ nguyên tắc rằng các thực thể của bạn nên tạo thành một đồ thị đối tượng, nơi các khóa ngoại không có chỗ, bởi vì chúng chỉ là "hiện vật", đến từ cơ sở dữ liệu quan hệ công việc.
Bạn nên viết lại các hiệp hội để được
- háo hức được nạp, nếu bạn luôn cần các tổ chức có liên quan
- viết một truy vấn DQL (tốt nhất là trên một Repository) để lấy-tham gia tổ chức có liên quan
- để cho nó lười biếng tải các thực thể liên quan bằng cách gọi một getter trên nó
Nếu bạn không tin, và thực sự muốn tránh tất cả những điều trên, có hai cách (mà tôi biết), để có được t id của một đối tượng liên quan, không kích hoạt tải và không sử dụng các thủ thuật như phản chiếu và tuần tự hóa:
Nếu bạn đã có đối tượng trong tay, bạn có thể truy xuất đối tượng bên trong mà Doctrine sử dụng trong nội bộ và sử dụng Phương pháp getEntityIdentifier(), chuyển cho đối tượng không tải (đối tượng proxy). Nó sẽ trả về cho bạn id, mà không kích hoạt tải lười.
Giả sử bạn có nhiều-một mối quan hệ, với nhiều bài viết thuộc về một thể loại:
$articleId = 1;
$article = $em->find('Article', $articleId);
$categoryId = $em->getUnitOfWork()->getEntityIdentifier($article->getCategory());
Coming 2.2, bạn sẽ có thể sử dụng chức năng DQL SẮC, để chọn chỉ là một chính nước ngoài, như thế này:
SELECT IDENTITY(u.Group) AS group_id FROM User u WHERE u.id = ?0
Đây là already committed cho các phiên bản phát triển.
Tuy nhiên, bạn thực sự nên cố gắng gắn bó với một trong các phương pháp "chính xác".
Câu hỏi hay - Tôi thường xuyên tham gia và muốn tìm cách truy cập trực tiếp giá trị khóa ngoại mà không phải tham gia liên kết mỗi lần. – cantera