Метод createQueryBuilder
Метод createQueryBuilder класса EntityManager создаёт объект QueryBuilder, который позволяет строить DQL-запросы программно, без написания сырого DQL вручную. Первым параметром передаётся псевдоним сущности в запросе, вторым - сама сущность (обычно в виде MyEntity::class). После создания строителя можно добавлять методы select, from, where, orderBy и получать результат через getQuery и getResult.
Синтаксис
public function createQueryBuilder(string $alias, string $entityClass = null): QueryBuilder
Пример
Давайте создадим простейший QueryBuilder и выберем все записи сущности Article:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder('a')
->select('a')
->from(Article::class, 'a');
$res = $qb->getQuery()->getResult();
return new Response(count($res));
}
}
?>
Результат выполнения кода:
"5"
Пример
Давайте добавим условие отбора и упорядочивание:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder('a')
->select('a')
->from(Article::class, 'a')
->where('a.published = :published')
->setParameter('published', true)
->orderBy('a.createdAt', 'DESC');
$res = $qb->getQuery()->getResult();
return new Response(count($res));
}
}
?>
Результат выполнения кода:
"3"
Пример
Давайте получим только одну запись с помощью setMaxResults и getOneOrNullResult:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function show(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder('a')
->select('a')
->from(Article::class, 'a')
->where('a.id = :id')
->setParameter('id', 1)
->setMaxResults(1);
$article = $qb->getQuery()->getOneOrNullResult();
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода:
"abcde"
Пример
Давайте посчитаем количество записей через агрегатную функцию COUNT:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function count(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder('a')
->select('COUNT(a.id)')
->from(Article::class, 'a');
$res = $qb->getQuery()->getSingleScalarResult();
return new Response($res);
}
}
?>
Результат выполнения кода:
"5"
Смотрите также
-
класс
EntityManager,
который управляет сущностями и их состоянием -
метод
createQuery,
который создаёт DQL-запрос из строки -
метод
getRepository,
который возвращает репозиторий сущности -
метод
find,
который находит сущность по первичному ключу