1

我正在尝试找到最佳优化方式来计算每篇文章的评论数

我有两个实体:文章和评论

评论实体有一个字段:

  /**
   * @ORM\ManyToOne(targetEntity="Easylist\ListmanagerBundle\Entity\Comment")
   * @ORM\JoinColumn(nullable=false)
   */
  private $comment;

所以在我的控制器中,我想获取所有文章:

 $em = $this->getDoctrine()->getEntityManager()
 $rep = $em->getRepository('ListmanagerBundle:Article');
 $all_Article = $rep->findAll();

我希望在此查询的结果中包含一个包含评论计数的字段,如下所示:

array(
  "id"       =>  "1",
  "Title"    => "Just a test",
  "nbr_coms" => "320"
)

我想使用服务,但我发现它在控制器端使用的服务不是实体,就像我想在我的实体中使用 EntityManager 一样,但这不是我认为的最佳方式。

我正在寻找一个优化的解决方案,因为我们正在谈论一篇数百万篇文章,每篇文章都有数百万条评论。

4

2 回答 2

2

您可以只选择要获取简单数组的字段:

public function countAll(){
    $query = $this->getEntityManager()->createQuery('
        SELECT a.id, a.title, COUNT(c.id)
        FROM ListmanagerBundle:Article a
        JOIN a.comments c
        GROUP BY a.id
     ');
    return $query->getResult(); 
}    

您可能需要查看您的映射以确保您Article具有$comments类型的属性Collection

于 2012-11-29T10:22:41.267 回答
1

在控制器中,您可以执行Article->getComments()->count()Comments->count()哪些是count()php 函数的快捷方式。

在树枝模板中,您可以执行 a {{ article.getComments|length }}or {{ comments|length }}which use mb_strlen()or count()

这两种方法都使用原生 php 函数,并且不进行额外的数据库查询。使用它可以让您坚持使用,findAll()而无需编写自定义查询。

于 2012-11-29T12:49:47.173 回答