论坛索引页面的条令查询


Doctrine query for forum index page

我想在symfony 2.3上创建一个小论坛。表为CategoriesSubcategoriesTopicsPosts,实体为CategorySubcategoryTopicPost。在明显的层次结构中,所有的表都通过一对多的关系链接在一起。

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

$this->getEntityManager()
->createQueryBuilder()
->select('c', 'sc', 't', 'u', 'p')
->from('MyForumBundle:Category', 'c')
->leftJoin('m.subcategories', 's')
->leftJoin('s.topics', 't')
->leftJoin('s.user', 'u')
->leftJoin('t.posts', 'p')
->OrderBy('m.id', 'ASC')
->addOrderBy('p.id', 'DESC')
->getQuery()
->getArrayResult();

如果我的论坛没有很多数据,我想这很好,但如果它变得更满,执行时间会很长。第二个问题是,我不知道如何查询一个主题中的帖子数量和子类别中的最后一篇帖子。

这是我的做法吗?如何在不破坏数组的情况下查询最后一篇文章和文章数量?我做错什么了吗?

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

如果你想要一个真正可扩展的应用程序,你需要限制一次访问的数据量。您的控制器通常不需要访问整个实体集。当然,它可能需要汇总数据,比如总数和计数。。。它可能需要一个较小的数据子集,比如某个特定类别的最近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)