我有两个通过双向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();
}
}
但它并没有给我我期待的结果......任何人都可以帮忙吗?谢谢!
答案 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();
}