Метод orderBy
Метод orderBy класса QueryBuilder
задаёт сортировку результатов DQL-запроса.
Первым параметром передаётся имя поля сущности,
по которому нужно отсортировать выборку,
а вторым - направление сортировки: 'ASC'
или 'DESC'. Метод полностью заменяет
ранее установленную сортировку, а не добавляет
новую. Если нужно добавить ещё одно поле к уже
заданной сортировке, используйте метод
addOrderBy.
Синтаксис
$qb->orderBy(field, direction);
Пример
Давайте отсортируем статьи по полю title
по возрастанию:
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
class ArticleRepository extends EntityRepository
{
public function findAllOrderedByTitle(): array
{
return $this->createQueryBuilder('a')
->orderBy('a.title', 'ASC')
->getQuery()
->getResult();
}
}
?>
Результат выполнения кода:
[
['id' => 2, 'title' => 'article 1'],
['id' => 1, 'title' => 'article 2'],
['id' => 3, 'title' => 'article 3'],
]
Пример
Давайте отсортируем статьи по полю createdAt
по убыванию, чтобы новые статьи шли первыми:
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
class ArticleRepository extends EntityRepository
{
public function findAllNewestFirst(): array
{
return $this->createQueryBuilder('a')
->orderBy('a.createdAt', 'DESC')
->getQuery()
->getResult();
}
}
?>
Результат выполнения кода:
[
['id' => 3, 'title' => 'article 3', 'createdAt' => '2024-03-01'],
['id' => 1, 'title' => 'article 2', 'createdAt' => '2024-02-01'],
['id' => 2, 'title' => 'article 1', 'createdAt' => '2024-01-01'],
]
Пример
Метод orderBy заменяет ранее установленную
сортировку. Если вызвать его дважды, применится
только последний вызов:
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
class ArticleRepository extends EntityRepository
{
public function demoReplaceOrder(): array
{
return $this->createQueryBuilder('a')
->orderBy('a.title', 'ASC')
->orderBy('a.createdAt', 'DESC')
->getQuery()
->getResult();
}
}
?>
В итоговом DQL останется только сортировка
по createdAt:
"SELECT a FROM App\Entity\Article a ORDER BY a.createdAt DESC"
Смотрите также
-
класс
QueryBuilder,
который строит DQL-запросы -
метод
addOrderBy,
который добавляет поле к сортировке -
метод
setMaxResults,
который ограничивает число строк -
метод
getQuery,
который возвращает объект Query