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

25

我有一些实体需要进行急切加载,而在其他情况下需要进行懒加载(甚至是额外的懒加载)。

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

目前唯一的急切加载方式是手动构造DQL-每次添加新实体时都需要更新它。

理想情况下,我只需加载根实体并强制急切加载所有关联对象。我能否这样做?

如果无法实现,那么为什么(除了未实施该功能之外还有其他原因吗)?

2个回答

26
如果您想使用内置的存储库方法(如find(),findAll()),除非在注释中设置了预加载,否则可能很难实现。
您可能需要在某个自定义存储库的方法中使用查询构建器(或原始DQL)来强制执行预加载。是的,您将不得不在添加实体时更新该方法,但至少您将始终知道有关懒/急切加载的情况,并且只需要在一个地方维护所有内容。
我认为没有一些$eagerLoad标志可以使用find()等方法,因为这些是用于简单任务的便利方法。如果您想要添加这样的标志,您可能很快会遇到限制递归预加载深度的情况。您还可能开始担心循环引用(例如任何双向关联)。

谢谢回复。我会暂时保留这个问题,以便其他人能够提供意见。 - calumbrodie
3
请在addSelect('alias')中添加所有关联表的别名以包括相关实体在结果中。 - juanmf

23

3
请注意,以下内容仅适用于Many-to-One和One-to-One关联。 - murtho
5
因为我刚刚浪费了2个小时,所以在使用setFetchMode方法时,第一个参数必须引用当前类而不是我们想要进行懒加载或急加载的类。并且类必须像"AppBundle\Entity\Student"一样指示(如示例中所示)。 - Remy Mellet
2
两个小时?算我一个!在Symfony中这件事真是太烦人了 :/ - Sliq
3
@Sliq,这是教义(Doctrine),而不是Symfony。 - progonkpa
3
那个链接似乎太旧了。使用Doctrine 2.5,我不得不使用:$query->setFetchMode(MyOriginalParent::class, 'parents_alias_used_in_query', Doctrine\ORM\Mapping\ClassMetadata::FETCH_LAZY);来使其运行懒加载(对于已经急切设置的实体)。 - userfuser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接