РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
8 of 258 menu

Метод createQuery

Метод createQuery класса EntityManager создаёт объект Query для выполнения DQL-запроса (Doctrine Query Language). Первым параметром передаётся строка DQL-запроса. Вторым необязательным параметром можно передать экземпляр класса ResultSetMapping для нативных SQL-запросов. Полученный объект Query поддерживает методы setParameter, setMaxResults, setFirstResult и getResult.

Синтаксис

$query = $em->createQuery($dql);

Пример

Давайте создадим DQL-запрос для выборки всех статей из сущности Article:

<?php namespace App\Repository; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; class ArticleRepository { private EntityManagerInterface $em; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function findAllArticles(): array { $dql = 'SELECT a FROM App\Entity\Article a'; $query = $this->em->createQuery($dql); return $query->getResult(); } } ?>

Результат выполнения метода findAllArticles при наличии трёх статей:

[ ['id' => 1, 'title' => 'article 1', 'text' => 'abcde'], ['id' => 2, 'title' => 'article 2', 'text' => 'hello'], ['id' => 3, 'title' => 'article 3', 'text' => 'user'] ]

Пример

Давайте передадим параметр в DQL-запрос через метод setParameter:

<?php namespace App\Repository; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; class ArticleRepository { private EntityManagerInterface $em; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function findById(int $id): ?Article { $dql = 'SELECT a FROM App\Entity\Article a WHERE a.id = :id'; $query = $this->em->createQuery($dql); $query->setParameter('id', $id); return $query->getOneOrNullResult(); } } ?>

Результат выполнения метода findById с аргументом 1:

['id' => 1, 'title' => 'article 1', 'text' => 'abcde']

Пример

Давайте ограничим количество возвращаемых записей через метод setMaxResults:

<?php namespace App\Repository; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; class ArticleRepository { private EntityManagerInterface $em; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function findLimited(int $limit): array { $dql = 'SELECT a FROM App\Entity\Article a ORDER BY a.id ASC'; $query = $this->em->createQuery($dql); $query->setMaxResults($limit); return $query->getResult(); } } ?>

Результат выполнения метода findLimited с аргументом 2:

[ ['id' => 1, 'title' => 'article 1', 'text' => 'abcde'], ['id' => 2, 'title' => 'article 2', 'text' => 'hello'] ]

Пример

Давайте выполним DQL-запрос с агрегатной функцией COUNT:

<?php namespace App\Repository; use App\Entity\Article; use Doctrine\ORM\EntityManagerInterface; class ArticleRepository { private EntityManagerInterface $em; public function __construct(EntityManagerInterface $em) { $this->em = $em; } public function countArticles(): int { $dql = 'SELECT COUNT(a.id) FROM App\Entity\Article a'; $query = $this->em->createQuery($dql); return (int) $query->getSingleScalarResult(); } } ?>

Результат выполнения метода countArticles при наличии трёх статей:

3

Смотрите также

  • класс EntityManager,
    который управляет сущностями Doctrine
  • метод createQueryBuilder,
    который создаёт QueryBuilder для построения DQL
  • метод getRepository,
    который возвращает репозиторий сущности
  • метод find,
    который находит сущность по первичному ключу
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить