Метод execute класса Query
Метод execute класса Query запускает на выполнение DQL-запрос,
который был построен через EntityManager. Первым параметром
можно передать массив параметров для подстановки в запрос. Вторым
параметром передаётся режим гидрации - способ преобразования
результатов запроса в PHP-структуры. Если параметры не переданы,
используются значения, заданные через setParameter.
Синтаксис
$res = $query->execute(parameters, hydrationMode);
Пример
Давайте выполним простой запрос, который вернёт все записи из таблицы article:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(EntityManagerInterface $em): Response
{
$query = $em->createQuery('SELECT a FROM AppEntityArticle a');
$res = $query->execute();
foreach ($res as $article) {
echo $article->getTitle();
}
return new Response('');
}
}
?>
Результат выполнения кода:
"abcde"
Пример
Давайте передадим параметр напрямую в метод execute:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(int $id, EntityManagerInterface $em): Response
{
$query = $em->createQuery('SELECT a FROM AppEntityArticle a WHERE a.id = :id');
$res = $query->execute(['id' => $id]);
$article = $res[0] ?? null;
if ($article === null) {
return new Response('not found');
}
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода для адреса /article/1:
"abcde"
Пример
Давайте передадим вторым параметром режим гидрации, чтобы получить результат в виде обычных массивов:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use DoctrineORMQuery;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/articles-array', name: 'article_array')]
public function arrayList(EntityManagerInterface $em): Response
{
$query = $em->createQuery('SELECT a.title, a.text FROM AppEntityArticle a');
$res = $query->execute([], Query::HYDRATE_ARRAY);
foreach ($res as $row) {
echo $row['title'] . ' - ' . $row['text'];
}
return new Response('');
}
}
?>
Результат выполнения кода:
"abcde - article"
Пример
Давайте используем скалярную гидрацию для получения одного значения:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use DoctrineORMQuery;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/articles/count', name: 'article_count')]
public function count(EntityManagerInterface $em): Response
{
$query = $em->createQuery('SELECT COUNT(a.id) FROM AppEntityArticle a');
$res = $query->execute([], Query::HYDRATE_SINGLE_SCALAR);
return new Response((string) $res);
}
}
?>
Результат выполнения кода:
"5"
Смотрите также
-
класс
Query,
который представляет собой DQL-запрос -
метод
getResult,
который возвращает результат запроса -
метод
setParameter,
который задаёт параметр для запроса -
метод
setHydrationMode,
который задаёт режим гидрации результата