Метод setUseOutputWalkers
Метод setUseOutputWalkers класса Paginator
включает или отключает использование output walkers
при построении пагинации. Первым параметром
передаётся булево значение: true включает
walkers, false выключает. По умолчанию
использование walkers включено.
Output walkers - это специальные обходчики DQL-запроса,
которые Doctrine применяет для корректного
подсчёта общего количества записей и выборки
данных в сложных запросах с JOIN и
GROUP BY. Если запрос простой, walkers можно
отключить для повышения производительности.
Синтаксис
public function setUseOutputWalkers(?bool $useOutputWalkers): void
Пример
Давайте создадим пагинатор и отключим использование output walkers для простого запроса:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Doctrine\ORM\Tools\Pagination\Paginator;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(EntityManagerInterface $em): Response
{
$query = $em->createQuery(
'SELECT a FROM App\Entity\Article a ORDER BY a.id ASC'
);
$paginator = new Paginator($query);
$paginator->setUseOutputWalkers(false);
return new Response('total: ' . count($paginator));
}
}
?>
Результат выполнения кода:
"total: 5"
Пример
Давайте включим output walkers для запроса
с GROUP BY, где корректный подсчёт
требует обхода:
<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Doctrine\ORM\Tools\Pagination\Paginator;
class ArticleController extends AbstractController
{
#[Route('/stats', name: 'article_stats')]
public function stats(EntityManagerInterface $em): Response
{
$query = $em->createQuery(
'SELECT a.status, COUNT(a.id) AS cnt
FROM App\Entity\Article a
GROUP BY a.status'
);
$paginator = new Paginator($query);
$paginator->setUseOutputWalkers(true);
return new Response('total: ' . count($paginator));
}
}
?>
Результат выполнения кода:
"total: 3"
Смотрите также
-
класс
Paginator,
который выполняет постраничную разбивку выборки -
метод
setFetchJoinCollection,
который включает fetch join при пагинации -
метод
getIterator,
который возвращает итератор по результатам -
метод
count,
который возвращает общее число записей