我遇到GroupBy问题。
我有实体,包含产品的类别和实体。我希望按类别(id)分组所有产品。
public function getAll()
{
$qb = $this->createQueryBuilder('p');
$qb->leftJoin('p.categories', 'category');
$qb->where('p.enabled = true');
$qb->andWhere('p.visible = true');
$qb->andWhere('p.quantity >= 1');
$qb->groupBy('category.id');
return $qb->getQuery()->getResult();
}
但是这只返回了几条记录(我认为每个类别都有1条记录)。
如何将所有产品分类?
由于
答案 0 :(得分:1)
所以,如果你有这样的事情:
类别(ID,名称)1-N产品(id,name,enabled,visible,quantity,category_id)和:
categories:
id name
1 category1
2 category2
products:
id name enabled visible quantity category_id
1 prod1 1 1 1 1
2 prod2 1 1 2 1
3 prod3 1 1 3 1
4 prod4 1 1 1 2
5 prod5 1 1 2 2
然后我认为你应该从CategoryRepository
开始,然后:
public function getAll()
{
$qb = $this->createQueryBuilder('c');
$qb
->select('c.name')
->addSelect("(SELECT GROUP_CONCAT(p.name) FROM AppBundle:Product p WHERE p.category = c.id AND p.enabled = :enabled AND p.visible = :visible AND p.quantity >= :number) AS prods")
->setParameter('enabled', true)
->setParameter('visible', true)
->setParameter('number', 1)
;
return $qb->getQuery()->getResult();
}
结果如下:
array:2 [▼
0 => array:2 [▼
"name" => "category1"
"prods" => "prod1,prod2,prod3"
]
1 => array:2 [▼
"name" => "category2"
"prods" => "prod4,prod5"
]
]
此外,您需要安装beberlei's DoctrineExtensions让教义了解GROUP_CONCAT功能