2011-10-18 51 views
1

我想計算給定特定文章的標籤數量。我有兩個實體(條,標籤),它是由許多-to-many關聯關係:如何使用DQL計算Symfony2中的多對多關係

//Bundle/Entity/Article.php 
/** 
* @ORM\ManyToMany(targetEntity="Tag") 
*/ 

private $tags; 

現在,我已經有了N個物品有m個標籤,我想知道如何往往是一個特定的標籤已被使用。

我對Symfony2和Doctrine都比較陌生。問題是,我不知道在哪裏適合這樣的查詢(我想它應該駐留在ArticleRepository中,但另一方面,它在TagRepository中是有意義的)以及如何加入正確的表(在此案例文章,article_tag,標籤)。

回答

2

,我能想到的最簡單的方法是隻設立第二條和標籤之間的雙向關係:

class Article 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles") 
    */ 
    private $tags; 
} 

class Tag 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Article", mappedBy="tags") 
    */ 
    private $articles; 
} 

然後你可以(假設你已經設置了標準的getter和setter)使用$tag->getArticles()->count();,其中$tag是一個託管標籤實體,用於獲取附加到該標籤的文章數量。這是有效的,因爲當填充ToMany關係屬性時,Doctrine使用Doctrine\Common\Collections\ArrayCollection的一個實例。檢查出來源here

另外,如果你走這條路線,一定要閱讀關於選擇擁有和反面的文檔here

+0

我其實發現了一個小問題。您提取標籤的方式會產生很多SQL請求。這個查詢效果更好,但我不確定它是否真的是「Doctrine Style」:'$ results = $ this-> getDoctrine() - > getEntityManager() - > createQuery('SELECT t.title,COUNT(t.id )FROM TridexTribloxBundle:Tag t JOIN t.articles b GROUP BY t.id') - > getResult();' – schneida

2

您可以通過使用特定的article..lets計數的標籤數說物品ID = 5:

$query=$em->createQuery("SELECT count(t.id) FROM Tag t WHERE ?1 MEMBER OF t.articles"); 
$query->setParameter(1,5); 
$result = $query->getSingleScalarResult(); 

這給我的第一條實體標籤的數量僅爲物品ID = 5