1

各記事のコメント数を取得するための最適化された方法を見つけようとしています

記事とコメントの 2 つのエンティティがあります。

コメント エンティティには次のフィールドがあります。

  /**
   * @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がある場合があります$commentsCollection

于 2012-11-29T10:22:41.267 に答える
1

コントローラでは、 php関数へのショートカットとして実行できArticle->getComments()->count()ます。Comments->count()count()

小枝テンプレートでは、{{ article.getComments|length }}または{{ comments|length }}を使用mb_strlen()できcount()ます。

どちらの方法もネイティブのphp関数を使用し、追加のdbクエリを実行しません。findAll()これを使用すると、カスタムクエリを作成しなくても、に固執することができます。

于 2012-11-29T12:49:47.173 に答える