Метод createQueryBuilder
Метод createQueryBuilder принадлежит классу
ServiceEntityRepository и создаёт объект
QueryBuilder для построения DQL-запросов
к базе данных. Первым параметром передаётся
псевдоним сущности (алиас), который затем
используется в запросе. Вторым необязательным
параметром можно передать индекс для кэширования
результатов. Метод возвращает готовый
QueryBuilder, к которому можно цепочкой
применять методы select, where,
orderBy и другие.
Синтаксис
public function createQueryBuilder(string $alias, ?string $indexBy = null): QueryBuilder
Пример
Давайте создадим репозиторий для сущности
Article и получим все записи, отсортированные
по полю id:
<?php
namespace AppRepository;
use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findAllOrdered(): array
{
return $this->createQueryBuilder('a')
->orderBy('a.id', 'ASC')
->getQuery()
->getResult();
}
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3"]
Пример
Давайте отфильтруем записи по булеву полю
published и ограничим выборку десятью
записями:
<?php
namespace AppRepository;
use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findPublished(): array
{
return $this->createQueryBuilder('a')
->where('a.published = :published')
->setParameter('published', true)
->setMaxResults(10)
->getQuery()
->getResult();
}
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3"]
Пример
Давайте используем конструктор запросов прямо в контроллере, получив репозиторий через внедрение зависимостей:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(ArticleRepository $repository): Response
{
$res = $repository->createQueryBuilder('a')
->select('a.title', 'a.text')
->orderBy('a.id', 'DESC')
->getQuery()
->getArrayResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title":"article 1","text":"abcde"},{"title":"article 2","text":"hello"}]
Смотрите также
-
класс
ServiceEntityRepository,
который является базовым классом для репозиториев -
метод
find,
который находит запись по первичному ключу -
метод
findBy,
который находит записи по заданным критериям -
метод
matching,
который находит записи по критериям с пагинацией