Метод andWhere класса Criteria
Метод andWhere класса Criteria добавляет новое условие
к уже существующему фильтру коллекции, объединяя их через логическое И.
Первым параметром передаётся строка с выражением, вторым - значение
для подстановки в это выражение. Метод возвращает сам объект Criteria,
что позволяет строить цепочки вызовов.
Метод удобен, когда нужно последовательно наращивать условия фильтрации в зависимости от логики приложения, не переписывая исходное выражение полностью.
Синтаксис
$criteria->andWhere(string $expr, mixed $value): Criteria
Пример
Давайте создадим критерий с одним условием и добавим к нему второе
через andWhere:
<?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', 'status' => 'active', 'views' => 10],
['title' => 'article', 'status' => 'active', 'views' => 5],
['title' => 'user', 'status' => 'draft', 'views' => 20],
['title' => 'hello', 'status' => 'active', 'views' => 30],
]);
$criteria = Criteria::create()
->where(Criteria::expr()->eq('status', 'active'))
->andWhere(Criteria::expr()->gt('views', 15));
$res = $collection->matching($criteria)->toArray();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title": "hello", "status": "active", "views": 30}]
Пример
Давайте добавим два условия через andWhere для фильтрации
по трём полям:
<?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', 'status' => 'active', 'views' => 10, 'published' => true],
['title' => 'article', 'status' => 'active', 'views' => 25, 'published' => false],
['title' => 'user', 'status' => 'active', 'views' => 30, 'published' => true],
['title' => 'hello', 'status' => 'draft', 'views' => 40, 'published' => true],
]);
$criteria = Criteria::create()
->where(Criteria::expr()->eq('status', 'active'))
->andWhere(Criteria::expr()->gt('views', 15))
->andWhere(Criteria::expr()->eq('published', true));
$res = $collection->matching($criteria)->toArray();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"title": "user", "status": "active", "views": 30, "published": true}]