如何使用DQL计算Symfony2中的多对多关系

时间:2011-10-18 15:17:51

标签: doctrine count symfony

我想计算给定特定文章的标签数量。我有两个与多对多关联相关的实体(文章,标签):

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

 private $tags;

现在我有n篇带m标签的文章,我想知道特定标签的使用频率。

我对Symfony2和Doctrine都比较陌生。问题是我不知道在哪里适合这样的查询(我想它应该存在于ArticleRepository中,但另一方面它有意义将它放在TagRepository中)以及如何加入正确的表(在此case Article,article_tag,Tag)。

2 个答案:

答案 0 :(得分:2)

我能想到的最简单的方法是在Article和Tag之间建立双向关系:

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的文档。

答案 1 :(得分:2)

您可以使用特定的文章来计算标签数量.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提供了文章实体中的标签数量。

相关问题