2011-07-19 55 views
0

我目前正在将最近的symfony 1.4应用程序移植到Symfony2和Doctrine2。我在转换映射信息(我们使用YAML文件)后注意到的第一件事是,查询用户对象进入无限循环。 我与这些协会玩过,发现我有一个周期性的。为了调试的目的,我删除了那个,想知道为什么它会在所有这些关联中循环。我刚刚要求所有用户。如何将延迟加载设置为Doctrine2的默认加载?

今天我又遇到了另一个对象的相同问题,只是它在930个查询后停止,并没有一个无限循环。看来Doctrine2在填充对象时会查询每个关联的所有对象。没有代理,没有延迟加载。

我启用了fetch: LAZY关于该关联和voilà,自动填充已停止! 但现在我希望将其作为默认行为,因为该模型有超过50个关联,并且我不想将这一行添加到所有这些关联。

如何激活延迟加载作为Doctrine 2中的默认加载?

回答

0

在经历了大量的汗水,并将模型简化为一个最小的例子之后,我发现了为什么Doctrine获取所有这些多行。

罪魁祸首是我使用的ORM工具。当它导入现有的数据库结构时,每个关系都被视为“一对一”关系。将所有85个关联中的关系更改为“一对多”(这是正确的) 应该做 做到了诀窍。

0

这实际上是如何延迟加载的作品。当您尝试获取相关对象时,Doctrine会自动发出另一个查询。现在,非常不鼓励使用延迟加载,尤其是当您只显示实体列表及其相关对象时。这就是你有960个查询的原因!尽管如此,Doctrine默认为懒惰,但在通过将查询导入单个查询的查询中获取相关实体时,您可能会很积极。上述

$blogs = $em->createQuery('SELECT b, p FROM Blog b JOIN b.posts p')->getResult(); 

的例子类似于SELECT b, p FROM Blog b但是当你访问的职位学说将不再发出另一个查询。

+0

其实这可能是问题的一部分,但我不以任何方式访问相关的对象。在你的例子中,我只会迭代博客并回应博客的标题,而不是对帖子进行任何操作。然而,Doctrine(或Symfony)使用单个查询填充每个博客中的所有帖子。 我怀疑我的一些设置导致水合过程不必要地完全填充每个对象。 – Yeti

+0

似乎模型中的循环引用与此有关。我目前正在编写一个最小的例子。 – Yeti

+0

也许您试图访问Blog – ken