Метод setFirstResult
Метод setFirstResult класса QueryBuilder задаёт смещение,
с которого начнётся выборка результатов запроса.
Первым параметром передаётся целое число - количество записей,
которые нужно пропустить перед началом выборки.
Метод возвращает объект QueryBuilder,
что позволяет строить цепочку вызовов.
Обычно метод используется совместно с setMaxResults
для реализации постраничной навигации: setFirstResult задаёт номер страницы,
а setMaxResults - количество записей на странице.
Синтаксис
$qb->setFirstResult(firstResult);
Пример
Давайте выберем статьи из таблицы, пропустив первые две записи:
<?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;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select('a')
->from(Article::class, 'a')
->orderBy('a.id', 'ASC')
->setFirstResult(2);
$res = $qb->getQuery()->getResult();
return new Response(count($res));
}
}
?>
Результат выполнения кода для пяти статей:
3
Пример
Давайте реализуем постраничную навигацию: пропустим первые пять записей и возьмём следующие пять:
<?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;
class ArticleController extends AbstractController
{
#[Route('/articles/page/{page}', name: 'article_page')]
public function page(int $page, EntityManagerInterface $em): Response
{
$perPage = 5;
$offset = ($page - 1) * $perPage;
$qb = $em->createQueryBuilder();
$qb->select('a')
->from(Article::class, 'a')
->orderBy('a.id', 'ASC')
->setFirstResult($offset)
->setMaxResults($perPage);
$res = $qb->getQuery()->getResult();
return new Response(count($res));
}
}
?>
Результат выполнения кода для адреса /articles/page/2 при пятнадцати статьях:
5
Пример
Давайте получим только первую статью, не пропуская записей:
<?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;
class ArticleController extends AbstractController
{
#[Route('/article/first', name: 'article_first')]
public function first(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select('a')
->from(Article::class, 'a')
->orderBy('a.id', 'ASC')
->setFirstResult(0)
->setMaxResults(1);
$res = $qb->getQuery()->getResult();
return new Response($res[0]->getTitle());
}
}
?>
Результат выполнения кода:
"article"
Смотрите также
-
метод
setMaxResults,
который задаёт количество результатов выборки -
класс
QueryBuilder,
который строит DQL-запросы -
метод
orderBy,
который задаёт сортировку результатов -
метод
getQuery,
который возвращает объект запроса