postLoad 实体与关联没有延迟加载?

Posted

技术标签:

【中文标题】postLoad 实体与关联没有延迟加载?【英文标题】:postLoad entity with association without lazy load? 【发布时间】:2015-10-23 16:13:01 【问题描述】:

这是我的 pb。

我有一个实体游戏和一个实体控制台 这是一个 ManyToMany 关联。

为了提高性能,我在同一个查询中加载游戏和控制台,如下所示:

$this->_em->getRepository('MyBundle:Console')
        ->createQueryBuilder('console')
        ->join('console.game', 'game')
        ->select('game', 'console')
        ->getQuery()->getResult();

当我使用 $console->getGames() 显示所有游戏而不执行任何查询时

当我使用 postLoad 事件 时,每个$console->getGames() 都会执行查询,因为该事件在对象完全水合之前开始。

在教义网站上,我发现了这个建议:

"请注意,使用 Doctrine\ORM\AbstractQuery#iterate() 时,postLoad 事件将在对象被水合后立即执行, 因此不能保证关联被初始化。这是 结合使用 Doctrine\ORM\AbstractQuery#iterate() 和 postLoad 事件处理程序。”

那么,有人知道如何将 postLoad 事件 与完整的水合实体一起使用吗?我不想延迟加载。

但这不是我的情况

【问题讨论】:

不清楚你的问题是什么 对不起,我编辑了我的帖子:所以,有人知道如何将 postLoad 事件与完整的水合实体一起使用吗? 首先将 ->select('console,game') 添加到您的查询中,因为按照当前编写的方式,您的查询仍然延迟加载游戏。然后也许用一个问题来更新你的问题。 我忘记将选择添加到帖子中,但我已将其添加到我的项目中 这就是 postLoad 的工作方式。您必须遍历结果并发送您自己的事件。 【参考方案1】:

这种行为实际上在 Doctrine 2.5 中有所改变。从 2.5 开始,所有关联都应在 postLoad 事件中加载。 Doctrine 2.5 应该可以解决您的问题,参考:

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/changelog/migration_2_5.html#events-postload-now-triggered-after-associations-are-loaded

【讨论】:

以上是关于postLoad 实体与关联没有延迟加载?的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis延迟加载和缓存

linq to sql 会自动延迟加载关联实体吗?

延迟的加载

hibernate 延迟加载

关联的教义 postLoad 事件

MyBatis一对多查询及延迟加载