论坛索引页面的学说查询

时间:2013-11-26 19:22:01

标签: php symfony doctrine indexing forum

我想在symfony 2.3上创建一个小论坛。 表格为CategoriesSubcategoriesTopicsPosts,实体为CategorySubcategoryTopic和{{ 1}}。这些表都通过明显层次结构中的一对多关系链接在一起。

对于Index页面,我想获得一个包含我需要的所有数据的数组,这样我就可以在视图中使用Post语句。 我所做的查询是

for

我想如果我的论坛没有大量数据,这样可以正常工作,但如果它变得更加充实,那么执行时间将非常长。第二个问题是我不知道如何查询主题中的帖子数量以及子类别中的最后一个帖子。

我的做法是不是这种做法?如何在不破坏我的阵列的情况下使用上一篇文章和帖子数进行查询? 我做错了吗?

1 个答案:

答案 0 :(得分:1)

你一直在做的方式适用于较小的域名,但我认为你发现它不能扩展。问题是您将Response中的大量数据传递回用户。随着域名的增长,问题只会变得更糟。

如果您需要真正的可伸缩应用程序,则需要限制一次访问的数据量。您的控制器通常不需要访问整个实体集。当然,它可能需要汇总数据,如总数和计数......它可能需要一个较小的数据子集,例如来自特定类别的最新10个帖子。但是你不需要阅读或更新整套实体。

以下是一些可能会有所帮助的事情:

计数

如果您只想获得结果集的计数,那么而不是:

count(
    $queryBuilder
        ->select('entity')
        ->getQuery()
        ->getResult()
);

尝试:

$queryBuilder
    ->select('count(entity.id)')
    ->getQuery
    ->getSingleScalarResult();

(请注意,虽然这两个答案都相同,但一个返回整个数据集,一个返回一个数字)

亚群

您可以像这样对其进行分页,而不是返回整个结果集:

$queryBuilder
    ->setFirstResult($pageNumber * $numPerPage)
    ->setMaxResults($numPerPage)

最后结果

沿着这些方向,您可以通过排序和限制获得最新结果:

$queryBuilder
    ->orderBy("entity.timestamp", "DESC")
    ->setMaxResults(10)