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 实体与关联没有延迟加载?的主要内容,如果未能解决你的问题,请参考以下文章