Это известная проблема для ассоциаций OneToOne. Об этом стоит прочитать github , который стоит прочитать. Решение (запрос на извлечение) было предложено и отклонено.
Рекомендация
Ваш вопрос предлагает то же решение, предложенное авторами Doctrine: изменить сторону отношений.
Другие опции изучены
У меня была похожая проблема с сущностью под названием Version
, у которой была OneToOne
двунаправленная связь с Settings
. Каждый раз, когда я запрашивал Version
(скажем, для 10 записей конкретной версии), Doctrine выполнял дополнительные запросы для объединенного Settings
(как будто это была отложенная загрузка этих объектов). Это произошло, хотя я нигде не упоминал Settings
, например, $Version->getSettings()->getSomeProperty()
.
Ручной JOIN
Единственное «решение» (хак), которое работает для меня, - это вручную включать JOIN для этой Settings
сущности каждый раз, когда я выполнял запрос на Version
. Но поскольку мне не нужна дополнительная сущность (в данном случае), это все равно будет один дополнительный лишний запрос, каждый раз, когда я запрашиваю эту таблицу различными способами.
Extra Lazy
Основываясь на других предложениях, я подумал, что, если я явно укажу это отношение как «лишнее ленивое», оно будет работать, например,
/**
* @ManyToMany(targetEntity="Settings", mappedBy="version", fetch="EXTRA_LAZY")
*/
Но это не влияет на гидратацию. См. Doctrine Docs для более подробной информации о том, что EXTRA_LAZY
делает.
Тип увлажнения: HYDRATE_ARRAY
Что помогло в моем случае (когда мне не нужна сущность), было указать, что я хочу получить массив (а не объект).
$query = $queryBuilder->getQuery();
$query->getResult(Query:HYDRATE_ARRAY);
Это возвращает массив, и в результате он не лениво загружает ассоциации OneToOne. Однако в других случаях, когда мне нужен объект-сущность, мне приходилось явно присоединяться к сущности (несмотря на то, что я этого не хотел).