Symfony / Doctrine - GroupBy не возвращает все результаты - PullRequest
0 голосов
/ 05 мая 2018

У меня проблема с 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 из каждой категории).

Как мне получить все товары, сгруппированные по категориям?

Спасибо

1 Ответ

0 голосов
/ 05 мая 2018

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

Категория (идентификатор, имя) 1-N Продукты (идентификатор, имя, включено, видимый, количество, 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"
    ]
]

Кроме того, вам нужно установить Bectlei's DoctrineExtensions , чтобы сообщить доктрине о функции GROUP_CONCAT

...