如何在ManyToMany Doctrine关系中选择已使用的项目

时间:2016-12-30 14:26:08

标签: symfony doctrine-orm

我有两个通过双向ManyToMany关系链接的实体(Item& Tag),并且我想显示实际用于与另一个实体(Item)的关系的实体(Tag)记录:

这是我的Item实体:

class Item
{
    /**
     * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Tag", inversedBy="items")
     */
    private $tags;
}

我的Tag enity:

class Tag
{
    /**
     * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Item", mappedBy="tags")
     */
    private $items;
}

现在,在我的标记存储库中,我尝试过这个:

class TagRepository extends \Doctrine\ORM\EntityRepository
{
    public function findAllUsed()
    {
        return $this->createQueryBuilder('t')
            ->leftJoin('t.items', 'items')
            ->groupBy('items.id')
            ->having('COUNT(t.id) > 0')
            ->orderBy('t.name', 'ASC')
            ->getQuery()
            ->getResult();
    }
}

但它并没有给我我期待的结果......任何人都可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我从头顶做了这个,但它应该可以工作,我使用了一个innerJoin而不是一个leftJoin,然后添加了一个确保你获得链接记录的地方:

public function findAllUsed()
    {
        return $this->createQueryBuilder('t')
            ->innerjoin('t.items', 'i')
            ->groupBy('i.id')
            ->where('i.id = t.items')
            ->having('COUNT(t.id) > 0')
            ->orderBy('t.name', 'ASC')
            ->getQuery()
            ->getResult();
    }
}

我用这个例子来表达答案:Query on a many-to-many relationship using Doctrine with Symfony2

答案 1 :(得分:1)

问题

我没有测试但似乎你的错误在count子句中。您正在计算代码having('COUNT(t.id) > 0')。所以它将返回所有标签。 另一个错误是你按照'项目进行分组。并且只选择'。你不需要分组。

<强>解决方案

更改&#39;标签&#39;对于&#39;项目&#39;在有条款。

public function findAllUsed()
{
    return $this->createQueryBuilder('t')
        ->leftJoin('t.items', 'items')            
        ->having('COUNT(items.id) > 0')
        ->orderBy('t.name', 'ASC')
        ->getQuery()
        ->getResult();
}

另一种更简单的方法是做一个像@KevinTheGreat这样的内部加入,但是检查不再需要或者在哪里有条款:

public function findAllUsed()
{
    return $this->createQueryBuilder('t')
        ->innerJoin('t.items', 'items')           
        ->orderBy('t.name', 'ASC')
        ->getQuery()
        ->getResult();
}