我正在尝试找到最佳的优化方式来获取每篇文章的评论数
我有两个实体:文章&评论
评论实体有一个字段:
/**
* @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用于我的实体,但这不是我想的最佳方式。
我正在寻找一种优化的解决方案,因为我们正在讨论数百万篇文章,每篇文章都有数百万条评论。
答案 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()
,而无需编写自定义查询。