2012-11-29 55 views
1

我'試圖找到最佳優化的方式來獲得的評論數爲每篇文章優化方法使用doctrine2/Symfony的

我有兩個實體獲得的一篇文章評論數():第&評論

註釋實體有一個字段:

/** 
    * @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用於實體一樣,但這不是我認爲的最佳方式。

我正在尋找一個優化的解決方案,因爲我們正在談論一個數百萬的文章,每個文章都有數百萬條評論。

回答

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

+0

這就是我要找的,謝謝 – ImadT

0

在一個控制器,你可以做Article->getComments()->count()Comments->count()這是count() PHP函數的快捷方式。

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

這兩種方法都使用本機php函數,並且不會執行額外的數據庫查詢。 使用此功能,您可以堅持使用findAll()而無需編寫自定義查詢。

+0

您的解決方案聽起來更加優化,但是當我嘗試它時出現此錯誤:調用未定義的方法。這看起來合乎邏輯,因爲我的Article類中沒有任何名爲getComments()的方法。 – ImadT

+0

由於您的Comment屬性不是複數形式,所以您肯定有在文章實體中創建的getComment()方法。但作爲一篇文章可以有多個評論,你的財產應該是*評論* –