在Doctrine 2中,可以在运行时更改获取模式(Eager/Lazy等)吗?

cal*_*die 21 orm doctrine datamapper entitymanager doctrine-orm

我有我想要加载的实体,以及其他ocassions懒惰(甚至是额外的懒惰)加载.

我的映射没有在我的YAML中声明的获取模式 - 因此它们使用默认值(延迟加载).

目前,热切加载的唯一方法是手动构建DQL - 每次添加新实体时我都需要更新它.

理想情况下,我只是加载根实体和强制加载所有关联对象的力.有什么方法可以做到这一点吗?

如果不是为什么(是否有一个原因超出它是一个未实现的功能)?

tim*_*dev 22

如果你想使用内置的存储库方法(find(),findAll()),你可能会运气不好,除非你把注意事项设置为急切加载注释.

您可能希望在某些自定义存储库的方法中使用查询构建器(或原始DQL)来强制在您想要的位置加载.是的,你必须在添加实体时更新该方法,但至少你总是知道懒惰/急切加载的情况,你只需要在一个地方维护它.

我认为没有一些$ eagerLoad标志来查找()等的原因是因为这些是简单任务的便捷方法.如果你想添加这样一个标志,你很快就会陷入需要通过深度限制递归预加载的情况.你也可能不得不开始担心周期性引用(例如任何双向关联).

  • 记得在`addSelect('alias')`中添加所有连接的表别名,以在结果中包含关联实体. (2认同)

小智 22

您可以使用setFetchMode()DQL方法来设置模式.请参阅文档:http: //readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

  • 因为我刚刚丢失了2个小时,所以在setFetchMode中,第一个参数必须引用当前类,而不是我们想要延迟或渴望获取的类.并且必须像AppBundle\Entity\Student那样表示类(如示例所示) (4认同)
  • @Sliq它是Doctrine,而不是Symfony (3认同)
  • 该链接似乎太旧了。使用 Doctrine 2.5,我必须使用: `$query->setFetchMode(MyOriginalParent::class, 'parents_alias_used_in_query', Doctrine\ORM\Mapping\ClassMetadata::FETCH_LAZY);` 让它懒惰地运行(对于已经急切地设置实体) (3认同)
  • 请注意,它只能用于多对一和一对一关联 (2认同)
  • 2小时 ?算我2天吧!这在 Symfony 中是多么烦人,太疯狂了:/ (2认同)