Symfony / Doctrine - GroupBy не возвращает все результаты

У меня проблема с 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();
}

Но это возвращает всего несколько записей (я думаю, по одной из каждой категории).

Как я могу сгруппировать все продукты по категориям?

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, если у вас есть что-то вроде этого:

Категория (идентификатор, имя) 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.

Привет, спасибо и извините за задержку с ответом. У меня отношения "многие ко многим". Должен был упомянуть об этом в моем вопросе.

kironet 07.05.2018 00:32

Я только что использовал тот же код, что и у меня, но в CategoryRepository, и он работает. Спасибо за предложение.

kironet 07.05.2018 00:58

Другие вопросы по теме