仅选择OneToMany已加入集合

时间:2016-01-28 18:01:12

标签: php doctrine symfony

我是symfony的新手,很抱歉,如果这对于anwer来说非常简单。

为了举例,我重写了代码片段,就好像我在写博客一样 我有一个BlogPost实体,其集合BlogComment的注释如下:

 /**
 * @OneToMany(targetEntity="BlogComment", mappedBy="post")
 */
private $comments;

从我的业余角度来看,Doctrine喜欢使用完整的对象,所以这个集合要么没有初始化,要么在我使用它的引用时懒得加载。

我想你可以想象我的BlogPost每个人至少有500 Blogcomment秒的开销和内存要求,每当我触摸$comments变量时它们都会被初始化。< / p>

我想要实现的是列出ie。 50篇博文,每篇都有20篇最新评论(没有内存爆炸)。此外,我希望能够只显示前20条评论与大多数“喜欢”(或通常只根据某些标准选择一个子集)。

是否有任何通常推荐和干净的方式来实现这种功能?当我实现这一点时,是不是使用这种“不完整”或“修改”的实体来破坏我的逻辑(当更新/删除子集中的项目并持久化时)?我认为这个解决方案很可能是自定义存储库中的一种方法,但我仍然无法看到它背后的想法。

事先,谢谢你的回答,我真的很好奇你能提出什么样的解决方案。

1 个答案:

答案 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

相关问题