Метод groupBy
Метод groupBy класса QueryBuilder добавляет в DQL-запрос конструкцию GROUP BY и принимает первым параметром поле или выражение для группировки. Его вызывают на объекте QueryBuilder при построении запроса через createQueryBuilder. Метод возвращает тот же объект QueryBuilder, поэтому его можно вызывать в цепочке с другими методами.
Синтаксис
groupBy(string $groupBy): self
Пример
Давайте сгруппируем записи по полю text и выведем DQL-запрос:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select('a')
->from(Article::class, 'a')
->groupBy('a.text');
return new Response($qb->getDQL());
}
}
?>
Результат выполнения кода:
"SELECT a FROM AppEntityArticle a GROUP BY a.text"
Пример
Давайте сгруппируем записи по полю string и выполним запрос, получив количество записей в каждой группе:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select('a.string, COUNT(a.id) as cnt')
->from(Article::class, 'a')
->groupBy('a.string');
$res = $qb->getQuery()->getResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[["string" => "abcde", "cnt" => 2], ["string" => "article", "cnt" => 3]]
Пример
Давайте сгруппируем записи с условием where по полю integer:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select('a.integer, COUNT(a.id) as cnt')
->from(Article::class, 'a')
->where('a.boolean = :flag')
->setParameter('flag', true)
->groupBy('a.integer');
return new Response($qb->getDQL());
}
}
?>
Результат выполнения кода:
"SELECT a.integer, COUNT(a.id) as cnt FROM AppEntityArticle a WHERE a.boolean = :flag GROUP BY a.integer"
Смотрите также
-
класс
QueryBuilder,
который строит DQL-запросы в Doctrine -
метод
addGroupBy,
который добавляет ещё одно поле в группировку -
метод
having,
который задаёт условие для сгруппированных записей -
метод
orderBy,
который задаёт сортировку результата