如何防止Doctrine延迟加载一对一关系?

时间:2012-03-16 10:51:59

标签: symfony doctrine-orm

编辑:如果您遇到类似的问题This Topic将会引起您的兴趣

我有一对一的双向关系的User和UserSettings。看来即使我在我的页面中没有使用任何UserSettings值,学说懒惰也会加载它。

这是预期的行为吗?为什么Doctrine获取这些数据,即使我没有在我的页面中使用它?如果我无法阻止它,我每次检索用户对象时都必须将此UserSettings加入User,但这是不必要的。

我该怎么做才能防止这种情况发生?

加载数据的代码:

->createQuery('SELECT p, u, s FROM TestPostBundle:Post p LEFT JOIN p.user u LEFT JOIN p.sub s WHERE p.id IN (:ids)')
->setParameter('ids', $ids)
->getResult();

在twig我循环浏览帖子并显示Post数据和相关用户,但我从未请求任何UserSettings变量,我根本不访问它们。

2 个答案:

答案 0 :(得分:4)

我在几个地方看过这个问题,并在这里添加我的答案:

我遇到了同样的问题,并记住symblog教程给出了一个示例,说明如何通过在不需要的表上显式添加左连接来减少延迟加载。当你根本不想要那些数据时,在连接中包含表格似乎很奇怪,但是这样你就可以将所有额外的查询减少到1并且运行得更快。

搜索延迟加载 - 约为http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html

的1/5

要解决用户/用户数据问题,请尝试将其添加到用户存储库,即使您不需要userdata,也可以在需要获取所有用户时使用。可以通过选择部分进一步增强: - > select('partial p。{user_id,name,}')

   public function getAll($limit = 500) {
       $qb = $this->createQueryBuilder('u')
          ->select('u', 'd')
          ->leftJoin('p.userdata', 'd')
       if (false === is_null($limit))
           $qb->setMaxResults($limit);
    return $qb->getQuery()->getResult();
    }

<强>更新
symblog教程似乎已关闭,我暂时离开这里的链接,以防万一临时。相关代码在答案中。

答案 1 :(得分:1)

我也面临同样的问题。似乎从逆向学说查询时也会查询拥有方。请参阅this discussion