У меня проблема с 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-N Продукты (идентификатор, имя, включено, видимое, количество, идентификатор_категории) и:
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"
]
]
Кроме того, вам необходимо установить DoctrineExtensions Беберлея, чтобы доктрина узнала о функции GROUP_CONCAT.
Я только что использовал тот же код, что и у меня, но в CategoryRepository, и он работает. Спасибо за предложение.
Привет, спасибо и извините за задержку с ответом. У меня отношения "многие ко многим". Должен был упомянуть об этом в моем вопросе.