Метод distinct
Метод distinct класса QueryBuilder
включает режим DISTINCT в DQL-запросе.
Этот режим убирает дубликаты строк из результата выборки.
Метод не принимает параметров и возвращает
тот же объект QueryBuilder, что позволяет
выстраивать цепочку вызовов.
Обычно distinct применяют вместе с select,
когда нужно получить уникальные значения одного
или нескольких полей сущности.
Синтаксис
$qb->distinct()
Пример
Давайте создадим QueryBuilder и включим режим distinct
для выборки уникальных значений поля name:
<?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.name')
->from(Article::class, 'a')
->distinct();
$res = $qb->getQuery()->getResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"name": "abcde"}, {"name": "article"}, {"name": "hello"}]
Пример
Давайте получим уникальные комбинации полей
name и active:
<?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.name', 'a.active')
->from(Article::class, 'a')
->distinct();
$res = $qb->getQuery()->getResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"name": "abcde", "active": true}, {"name": "article", "active": false}]
Пример
Давайте посмотрим, какой DQL-запрос
генерируется при вызове distinct:
<?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.name')
->from(Article::class, 'a')
->distinct();
$dql = $qb->getDQL();
return new Response($dql);
}
}
?>
Результат выполнения кода:
"SELECT DISTINCT a.name FROM AppEntityArticle a"
Смотрите также
-
класс
QueryBuilder,
который строит DQL-запросы -
метод
select,
который задаёт выбираемые поля -
метод
from,
который задаёт сущность выборки -
метод
getDQL,
который возвращает итоговый DQL-запрос