Класс Criteria
Класс Criteria используется для описания того,
какие элементы коллекции нужно выбрать, в каком порядке
их отсортировать и сколько записей вернуть. Объект
Criteria передаётся первым параметром в метод
matching класса ArrayCollection, который
возвращает новую коллекцию, отфильтрованную по заданным
условиям. Условия задаются через методы where,
andWhere и orWhere, сортировка - через
orderBy, а лимиты - через setFirstResult
и setMaxResults.
Синтаксис
<?php
use Doctrine\Common\Collections\Criteria;
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('field', 'value'));
$criteria->orderBy(['field' => Criteria::ASC]);
$criteria->setFirstResult(0);
$criteria->setMaxResults(10);
?>
Пример
Давайте отфильтруем коллекцию по полю status
со значением 'active':
<?php
namespace App\Service;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
class ArticleService
{
public function filter(): ArrayCollection
{
$collection = new ArrayCollection([
['title' => 'article', 'status' => 'active'],
['title' => 'abcde', 'status' => 'draft'],
['title' => 'hello', 'status' => 'active'],
]);
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('status', 'active'));
$res = $collection->matching($criteria);
return $res;
}
}
?>
Результат выполнения кода:
["article", "hello"]
Пример
Давайте отсортируем коллекцию по полю title
по возрастанию и ограничим результат двумя записями:
<?php
namespace App\Service;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
class ArticleService
{
public function sort(): ArrayCollection
{
$collection = new ArrayCollection([
['title' => 'hello', 'status' => 'active'],
['title' => 'abcde', 'status' => 'active'],
['title' => 'article', 'status' => 'active'],
]);
$criteria = Criteria::create();
$criteria->orderBy(['title' => Criteria::ASC]);
$criteria->setMaxResults(2);
$res = $collection->matching($criteria);
return $res;
}
}
?>
Результат выполнения кода:
["abcde", "article"]
Пример
Давайте объединим два условия через andWhere:
<?php
namespace App\Service;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
class ArticleService
{
public function combine(): ArrayCollection
{
$collection = new ArrayCollection([
['title' => 'article', 'status' => 'active', 'count' => 5],
['title' => 'abcde', 'status' => 'active', 'count' => 1],
['title' => 'hello', 'status' => 'draft', 'count' => 9],
]);
$criteria = Criteria::create();
$criteria->where(Criteria::expr()->eq('status', 'active'));
$criteria->andWhere(Criteria::expr()->gt('count', 2));
$res = $collection->matching($criteria);
return $res;
}
}
?>
Результат выполнения кода:
["article"]
Смотрите также
-
метод
create,
который создаёт новый объект Criteria -
метод
where,
который задаёт первое условие фильтрации -
метод
orderBy,
который задаёт сортировку результата -
метод
setMaxResults,
который ограничивает количество записей