Метод 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-запросы