Метод orderBy класса Criteria
Метод orderBy класса Criteria добавляет правило сортировки элементов коллекции.
Первым параметром передаётся имя поля, по которому нужно отсортировать элементы.
Вторым параметром передаётся направление сортировки: Criteria::ASC для сортировки по возрастанию
или Criteria::DESC для сортировки по убыванию.
Метод возвращает сам объект Criteria, поэтому его можно вызывать цепочкой.
Синтаксис
$criteria->orderBy(string $field, string $order = Criteria::ASC)
Пример
Давайте отсортируем коллекцию статей по полю title по возрастанию:
<?php
namespace App\Controller;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$collection = new ArrayCollection([
['title' => 'abcde', 'views' => 3],
['title' => 'article', 'views' => 1],
['title' => 'user', 'views' => 2],
]);
$criteria = Criteria::create()->orderBy(['title' => Criteria::ASC]);
$res = $collection->matching($criteria)->toArray();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title":"abcde","views":3},{"title":"article","views":1},{"title":"user","views":2}]
Пример
Давайте отсортируем коллекцию статей по полю views по убыванию:
<?php
namespace App\Controller;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$collection = new ArrayCollection([
['title' => 'abcde', 'views' => 3],
['title' => 'article', 'views' => 1],
['title' => 'user', 'views' => 2],
]);
$criteria = Criteria::create()->orderBy(['views' => Criteria::DESC]);
$res = $collection->matching($criteria)->toArray();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title":"abcde","views":3},{"title":"user","views":2},{"title":"article","views":1}]
Пример
Давайте зададим сортировку сразу по двум полям: сначала по views по убыванию,
затем по title по возрастанию:
<?php
namespace App\Controller;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$collection = new ArrayCollection([
['title' => 'user', 'views' => 1],
['title' => 'abcde', 'views' => 3],
['title' => 'article', 'views' => 1],
]);
$criteria = Criteria::create()->orderBy([
'views' => Criteria::DESC,
'title' => Criteria::ASC,
]);
$res = $collection->matching($criteria)->toArray();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title":"abcde","views":3},{"title":"article","views":1},{"title":"user","views":1}]
Пример
Давайте скомбинируем сортировку с фильтрацией через метод where:
<?php
namespace App\Controller;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$collection = new ArrayCollection([
['title' => 'abcde', 'views' => 3],
['title' => 'article', 'views' => 1],
['title' => 'user', 'views' => 5],
]);
$criteria = Criteria::create()
->where(Criteria::expr()->gt('views', 2))
->orderBy(['views' => Criteria::ASC]);
$res = $collection->matching($criteria)->toArray();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title":"abcde","views":3},{"title":"user","views":5}]
Смотрите также
-
класс
Criteria,
который задаёт условия выборки элементов коллекции -
метод
create,
который создаёт новый объект Criteria -
метод
where,
который задаёт условие фильтрации элементов -
метод
setMaxResults,
который ограничивает количество возвращаемых элементов