Метод andHaving
Метод andHaving класса QueryBuilder добавляет
новое условие в секцию HAVING SQL-запроса,
объединяя его с предыдущими условиями через логический
оператор AND. Первым параметром передаётся строка
с условием. Вторым необязательным параметром можно
передать имя параметра-заглушки для безопасной подстановки
значений. Метод возвращает тот же объект QueryBuilder,
что позволяет строить цепочки вызовов.
Синтаксис
andHaving($having, $parameter = null)
Пример
Давайте сгруппируем статьи по полю text и оставим
только те группы, где количество записей больше 1:
<?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.text', 'COUNT(a.id) as cnt')
->from(Article::class, 'a')
->groupBy('a.text')
->having('COUNT(a.id) > :cnt')
->setParameter('cnt', 1);
$res = $qb->getQuery()->getResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"text": "abcde", "cnt": 3}, {"text": "hello", "cnt": 2}]
Пример
Давайте добавим второе условие через andHaving,
чтобы отфильтровать группы ещё и по количеству:
<?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.text', 'COUNT(a.id) as cnt')
->from(Article::class, 'a')
->groupBy('a.text')
->having('COUNT(a.id) > :min')
->andHaving('COUNT(a.id) < :max')
->setParameter('min', 1)
->setParameter('max', 5);
$res = $qb->getQuery()->getResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"text": "abcde", "cnt": 3}, {"text": "hello", "cnt": 2}]
Пример
Давайте передадим имя параметра вторым аргументом метода
andHaving вместо использования setParameter:
<?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.text', 'COUNT(a.id) as cnt')
->from(Article::class, 'a')
->groupBy('a.text')
->having('COUNT(a.id) > :min')
->andHaving('COUNT(a.id) < :max', 'max')
->setParameter('min', 1)
->setParameter('max', 5);
$res = $qb->getQuery()->getResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"text": "abcde", "cnt": 3}, {"text": "hello", "cnt": 2}]
Смотрите также
-
метод
having,
который задаёт первое условие HAVING -
метод
groupBy,
который группирует записи по полю -
метод
setParameter,
который задаёт значение параметра-заглушки -
класс
QueryBuilder,
который строит DQL-запросы