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

Doctrine 如何使用DQL计算Symfony2中的多对多关系,doctrine,count,symfony,Doctrine,Count,Symfony,我想计算一个特定文章的标签数量。我有两个实体(文章、标签),它们由多对多关联关联: //Bundle/Entity/Article.php /** * @ORM\ManyToMany(targetEntity="Tag") */ private $tags; 现在我有n篇文章有m个标签,我想知道一个特定的标签被使用的频率 我对Symfony2和学说都比较陌生。问题是,我不知道在哪里适合这样的查询(我想它应该位于ArticleRepository中,但另一方面,将它放在TagReposi

我想计算一个特定文章的标签数量。我有两个实体(文章、标签),它们由多对多关联关联:

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

 private $tags;
现在我有n篇文章有m个标签,我想知道一个特定的标签被使用的频率


我对Symfony2和学说都比较陌生。问题是,我不知道在哪里适合这样的查询(我想它应该位于ArticleRepository中,但另一方面,将它放在TagRepository中是有意义的),以及如何连接正确的表(在本例中为Article,Article_tag,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
是一个托管标记实体,用于获取附加到该标记的文章数。这是因为在填充任何关系属性时,条令使用
Doctrine\Common\Collections\ArrayCollection
的实例。查看来源


此外,如果你走这条路线,一定要阅读关于选择拥有方和反向方的文档。

我能想到的最简单的方法就是在文章和标签之间建立双向关系:

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
是一个托管标记实体,用于获取附加到该标记的文章数。这是因为在填充任何关系属性时,条令使用
Doctrine\Common\Collections\ArrayCollection
的实例。查看来源


此外,如果您选择这条路线,请确保您阅读了关于选择拥有方和反向方的文档。

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

您可以使用特定项目计算标记数。假设项目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的标签数量。

我实际上发现了一个小问题。获取标记的方式会产生大量SQL请求。这个查询工作得更好,尽管我不确定它是否真的是“条令风格”:
$results=$This->get条令()->getEntityManager()->createQuery('SELECT t.title,COUNT(t.id)FROM TridexTribloxBundle:Tag t JOIN t t.articles b GROUP BY t.id')->getResult()$results=$This->get条令()->getEntityManager()->createQuery('SELECT t.title,COUNT(t.id)FROM TridexTribloxBundle:Tag t JOIN t t.articles b GROUP BY t.id')->getResult()