В Doctrine 2 можно ли изменять режим извлечения (Eager / Lazy и т. Д.) Во время выполнения? - PullRequest
21 голосов
/ 04 августа 2011

У меня есть объекты, которые я хотел бы загрузить с большим нетерпением, а в других случаях - ленивая (или даже лишняя) загрузка.

У моих отображений нет режима выборки, объявленного в моем YAML, поэтому они используют значение по умолчанию (отложенная загрузка).

В настоящее время единственный способ загружать данные - создавать DQL вручную, и мне нужно обновлять его каждый раз, когда я добавляю новую сущность.

В идеале я бы просто загрузил корневую сущность и принудительно загрузил бы все связанные объекты. Есть ли способ, которым я могу это сделать?

Если нет, то почему (кроме невыполненной возможности есть причина)?

Ответы [ 2 ]

22 голосов
/ 17 февраля 2012

Вы можете использовать setFetchMode() метод DQL для установки режима. Смотрите документацию: http://readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

22 голосов
/ 05 августа 2011

Если вы хотите использовать встроенные методы репозитория (find (), findAll ()), вам, скорее всего, не повезет, если вы не захотите загружать свои аннотации.

возможно, вы захотите использовать построитель запросов (или необработанный DQL) в методе какого-либо пользовательского репозитория, чтобы принудительно загружать его туда, куда вам нужно.Да, вам придется обновлять этот метод при добавлении сущностей, но, по крайней мере, вы всегда будете знать, что происходит с отложенной / активной загрузкой, и вам нужно будет поддерживать все это в одном месте.

Полагаю, причина в том, что для поиска () и т. Д. Нет флага $ eagerLoad, заключается в том, что это удобные методы для простых задач.Если бы вы хотели добавить такой флаг, вы бы быстро попали в ситуации, когда вы хотели бы ограничить рекурсивную загрузку по глубине.Возможно, вам также придется начать беспокоиться о циклических ссылках (например, о любой двунаправленной ассоциации).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...