使用doctrine2 / Symfony获取文章注释count()的优化方法

时间:2012-11-29 09:52:53

标签: php optimization symfony doctrine-orm entitymanager

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

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

评论实体有一个字段:

  /**
   * @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用于我的实体,但这不是我想的最佳方式。

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

2 个答案:

答案 0 :(得分:1)

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

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属性

答案 1 :(得分:0)

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

在树枝模板中,您可以{{ article.getComments|length }}{{ comments|length }}使用mb_strlen()count()

两种方法都使用本机php函数,不进行额外的数据库查询。 使用此功能,您可以坚持使用findAll(),而无需编写自定义查询。