我是symfony的新手,很抱歉,如果这对于anwer来说非常简单。
为了举例,我重写了代码片段,就好像我在写博客一样
我有一个BlogPost
实体,其集合BlogComment
的注释如下:
/**
* @OneToMany(targetEntity="BlogComment", mappedBy="post")
*/
private $comments;
从我的业余角度来看,Doctrine喜欢使用完整的对象,所以这个集合要么没有初始化,要么在我使用它的引用时懒得加载。
我想你可以想象我的BlogPost
每个人至少有500 Blogcomment
秒的开销和内存要求,每当我触摸$comments
变量时它们都会被初始化。< / p>
我想要实现的是列出ie。 50篇博文,每篇都有20篇最新评论(没有内存爆炸)。此外,我希望能够只显示前20条评论与大多数“喜欢”(或通常只根据某些标准选择一个子集)。
是否有任何通常推荐和干净的方式来实现这种功能?当我实现这一点时,是不是使用这种“不完整”或“修改”的实体来破坏我的逻辑(当更新/删除子集中的项目并持久化时)?我认为这个解决方案很可能是自定义存储库中的一种方法,但我仍然无法看到它背后的想法。
事先,谢谢你的回答,我真的很好奇你能提出什么样的解决方案。
答案 0 :(得分:0)
对于一个大名单objets来说,主义并不好。它将比while ($row = $stmt->fetch())
后面的经典SQL查询慢得多。有时,执行本机查询会更好。 50篇博客文章* 20条评论=填充了1000个对象,如果您获得每个结果的用户名,甚至可能更多。
无论如何,您将需要使用原生查询,因为我不认为您可以使用纯DQL查询在每篇博文中获得20条评论。您需要执行一些已加入的子查询以限制为20条评论,有关详细信息,请参阅此帖子:MySQL JOIN with LIMIT 1 on joined table
完成原生查询后,如果确实需要对象,可以使用ResultSetMappingBuilder将结果绑定到Doctrine实体:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/native-sql.html#resultsetmappingbuilder