Метод 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,
который находит сущность по первичному ключу