我目前正在将最近的symfony 1.4应用程序移植到Symfony2和Doctrine2。一旦我转换了映射信息(我们使用YAML文件),我注意到的第一件事就是查询用户对象进入无限循环。 我和协会一起玩,发现我有一个周期性的协会。为了调试目的,我删除了那个,想知道为什么它会遍历所有这些关联。我刚刚要求所有用户。
今天我又用另一个对象遇到了同样的问题,只是它在930次查询后停止并且没有无限循环。似乎Doctrine2在填充对象时会查询每个关联的所有对象。没有代理,没有延迟加载。
我在该关联上启用了fetch: LAZY
并且自动填充了自动人口!
但现在我希望将其作为默认行为,因为该模型有超过50个关联,我不想将此行添加到所有这些关联。
如何激活延迟加载作为Doctrine 2中的默认值?
答案 0 :(得分:0)
这实际上是延迟加载的工作原理。当您尝试获取相关对象时,Doctrine将自动发出另一个查询。现在非常不鼓励使用延迟加载,尤其是当您只显示实体及其相关对象的列表时。这就是你有960个查询的原因!尽管如此,Doctrine默认为懒惰,但是在通过在查询中加入相关实体来获取相关实体时,您可能会非常积极。这会导致单个查询。
$blogs = $em->createQuery('SELECT b, p FROM Blog b JOIN b.posts p')->getResult();
上面的示例与SELECT b, p FROM Blog b
类似,但是当您访问帖子时,Doctrine将不再发出其他查询。
答案 1 :(得分:0)
经过多次努力并将模型简化为最小的例子后,我发现了为什么Doctrine会获取所有这些多行。
罪魁祸首是我正在使用的ORM工具。在导入现有数据库结构时,每个关系都被视为“一对一”关系。在所有85个关联上改变关系为“一对多”(正确)应该做了伎俩。