Прокси
Прокси Doctrine - это просто оболочка, которая расширяет класс сущностей для обеспечения отложенной загрузки для него.
По умолчанию, когда вы запрашиваете Entity Manager для сущности, которая связанас другой сущностью, связанная сущность не будет загружена из базы данных, но будет помещена в прокси-объект.Когда ваше приложение затем запрашивает свойство или вызывает метод этой прокси-сущности, Doctrine будет загружать сущность из базы данных (кроме случаев, когда вы запрашиваете идентификатор, который всегда известен прокси-серверу).
Это происходит полностьюпрозрачно для вашего приложения, потому что прокси расширяет ваш класс сущностей.
Doctrine по умолчанию будет гидрировать ассоциации как прокси с отложенной загрузкой, если вы не JOIN
их в своем запросе или установите режим выборки наEAGER
.
Теперь я должен добавить это, потому что у меня недостаточно репутации, чтобы комментировать везде:
К сожалению, ответ Крозина содержит дезинформацию.
Если вы выполните запрос DQL, например
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
, вы не получите (прокси) объект-сущность, но ассоциативный массив.Поэтому невозможно лениво загружать какие-либо дополнительные свойства.
Имея это в виду, можно прийти к выводу, что пример варианта использования также не будет работать.Чтобы получить доступ к $article
как объекту, нужно изменить DQL на что-то подобное:
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
Это дает вам частично загруженный объект сущности.
Но имейте в виду, что частичные объекты не являются прокси!Ленивая загрузка не относится к ним.Поэтому использование частичных объектов, как правило, опасно, и его следует избегать.Подробнее: Частичные объекты - Доктрина 2 Документация ORM 2