Доверенные
Прокси-сервер 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
Это дает вам частично загруженный объект сущности.
Но помните, что частичные объекты не являются прокси! Ленивая загрузка к ним не применяется. Следовательно, использование частичных объектов обычно опасно, и этого следует избегать. Подробнее: Частичные объекты - документация Doctrine 2 ORM 2