РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
46 of 258 menu

Метод having

Метод having класса QueryBuilder добавляет условие HAVING в SQL-запрос. Он применяется после группировки GROUP BY и позволяет отфильтровать группы по результатам агрегатных функций, например COUNT, SUM или AVG. Первым параметром передаётся строка с условием. Вторым необязательным параметром можно передать имя параметра-плейсхолдера.

Синтаксис

having(string $having, ?string $alias = null)

Пример

Давайте сгруппируем статьи по автору и оставим только тех авторов, у которых больше одной статьи:

<?php namespace App\Repository; use App\Entity\Article; use Doctrine\ORM\EntityRepository; class ArticleRepository extends EntityRepository { public function findAuthorsWithManyArticles(): array { $qb = $this->createQueryBuilder('a'); $qb->select('a.author, COUNT(a.id) AS articleCount') ->groupBy('a.author') ->having('COUNT(a.id) > 1'); return $qb->getQuery()->getResult(); } } ?>

Результат выполнения кода:

[['author' => 'user', 'articleCount' => 3], ['author' => 'abcde', 'articleCount' => 2]]

Пример

Давайте передадим значение через параметр-плейсхолдер:

<?php namespace App\Repository; use App\Entity\Article; use Doctrine\ORM\EntityRepository; class ArticleRepository extends EntityRepository { public function findAuthorsWithMinArticles(int $min): array { $qb = $this->createQueryBuilder('a'); $qb->select('a.author, COUNT(a.id) AS articleCount') ->groupBy('a.author') ->having('COUNT(a.id) > :min') ->setParameter('min', $min); return $qb->getQuery()->getResult(); } } ?>

Результат выполнения кода для $min = 2:

[['author' => 'user', 'articleCount' => 3]]

Пример

Давайте используем агрегатную функцию SUM для фильтрации групп по суммарному значению:

<?php namespace App\Repository; use App\Entity\Article; use Doctrine\ORM\EntityRepository; class ArticleRepository extends EntityRepository { public function findAuthorsWithTotalViews(int $minViews): array { $qb = $this->createQueryBuilder('a'); $qb->select('a.author, SUM(a.views) AS totalViews') ->groupBy('a.author') ->having('SUM(a.views) > :minViews') ->setParameter('minViews', $minViews); return $qb->getQuery()->getResult(); } } ?>

Результат выполнения кода для $minViews = 100:

[['author' => 'user', 'totalViews' => 250], ['author' => 'abcde', 'totalViews' => 180]]

Смотрите также

  • метод andHaving,
    который добавляет условие HAVING через AND
  • метод groupBy,
    который задаёт группировку результатов
  • метод setParameter,
    который привязывает значение к плейсхолдеру
  • класс QueryBuilder,
    который строит DQL-запросы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить