我有我想要加载的实体,以及其他偶像加载懒惰(甚至是额外的懒惰)。
我的映射在我的YAML中没有声明获取模式 - 因此它们使用默认值(延迟加载)。
目前,热切加载的唯一方法是手动构建DQL - 每次添加新实体时都需要更新它。
理想情况下,我只需加载根实体并强制加载所有关联对象。我有什么方法可以做到这一点吗?
如果不是为什么(除了它是否有一个未实现的功能之外的原因)?
答案 0 :(得分:22)
如果你想使用内置的存储库方法(find(),findAll()),除非你急切地加载注释,否则你可能会运气不好。
您可能希望在某些自定义存储库的方法中使用查询构建器(或原始DQL)来强制在您希望的位置加载。是的,你必须在添加实体时更新该方法,但至少你总是知道在懒惰/急切加载方面发生了什么,你只需要在一个地方维护它。
我认为没有一些$ eagerLoad标志来查找()等的原因是因为这些是简单任务的便捷方法。如果你想添加这样一个标志,你很快就会陷入需要通过深度限制递归预加载的情况。你也可能不得不开始担心周期性引用(例如任何双向关联)。
答案 1 :(得分:22)
您可以使用DQL的setFetchMode()
方法来设置模式。查看文档:
http://readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql