Проксі
Проксі-сервер Doctrine - це лише обгортка, яка розширює клас сутності, щоб забезпечити для нього Lazy Loading.
За замовчуванням, коли ви запитуєте диспетчера сутності для сутності, асоційованої з іншим об'єктом, асоційоване об'єкт не завантажуватиметься з бази даних, а загортається у проксі-об'єкт. Коли ваша програма потім запитує властивість або викликає метод цього проксі-об'єкта, Doctrine завантажить об'єкт із бази даних (за винятком випадків, коли ви вимагаєте ідентифікатор, який завжди відомий проксі).
Це трапляється повністю прозорим для вашої програми через те, що проксі розширює ваш клас сутності.
Доктрина за замовчуванням гідратує асоціації як ледачі завантаження проксі-серверів, якщо ви не введете JOIN
їх у своєму запиті або встановите режим отримання EAGER
.
Тепер я повинен додати це, оскільки мені не вистачає репутації, щоб коментувати всюди:
На жаль, відповідь Крозіна містить дезінформацію.
Якщо ви виконуєте такий запит DQL
SELECT u.id, u.username FROM Entity\User u WHERE u.id = :id
ви отримаєте не об'єкт (проксі) сутності, а асоціативний масив. Тож не можна ледаче завантажувати будь-які додаткові властивості.
Зважаючи на це, можна дійти висновку, що і приклад використання не працюватиме. 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
Це дає вам частково завантажений об'єкт сутності.
Але будьте уважні, що часткові об’єкти - це не проксі! Ледаче завантаження не стосується їх. Тому використання часткових предметів, як правило, небезпечно і слід уникати. Детальніше: Часткові об'єкти - Документа 2 ORM 2 документація