【问题标题】:How to prevent Doctrine from lazy loading one to one relationsip?如何防止 Doctrine 懒加载一对一关系?
【发布时间】:2012-03-16 10:51:59
【问题描述】:

编辑:如果你有类似的问题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();

我在树枝中循环浏览帖子并显示帖子数据和关联用户,但我从不请求任何 UserSettings 变量,我根本没有访问它们。

【问题讨论】:

  • 请贴出加载用户的代码。
  • @FractalizeR 我刚刚添加了代码
  • 这不是预期的行为。我猜您实际上在某个地方获得了用户设置。尝试在 getUserSetting 方法中添加 die() 语句。这应该证实或否认我的猜测。
  • @Cerad 我将 die() 语句放在用户的 getUserSettings 函数中并且它没有被调用,这证实了我没有调用任何 UserSettings 方法。我还能如何解决这个问题?
  • 我在相关问题中发布了解决方法:stackoverflow.com/a/14885237/138106

标签: symfony doctrine-orm


【解决方案1】:

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

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

搜索延迟加载 - 大约下降了 1/5 http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html

要解决用户/用户数据问题,请尝试将其添加到用户存储库,并在需要获取所有用户时使用 to,即使您不想要用户数据也是如此。可以通过选择 partial 来进一步增强:->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 教程似乎已关闭,我暂时将链接留在这里,以防它是临时的。相关代码在答案中。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。似乎从反面学说查询时也会查询拥有方。见this discussion

    【讨论】:

    猜你喜欢
    • 2021-03-13
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多