Метод count класса Expr
Метод count класса Expr создаёт выражение для подсчёта количества элементов в коллекции или массиве. Он применяется при построении DQL-запросов через QueryBuilder. В качестве первого параметра передаётся выражение, которое нужно подсчитать. Второй параметр задаёт тип подсчёта. Метод возвращает строку с DQL-выражением, которую можно использовать в методах select, where и других.
Синтаксис
$expr->count($field, $distinct = false)
Пример
Давайте подсчитаем количество записей в таблице через QueryBuilder:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select($qb->expr()->count('a.id'))
->from(Article::class, 'a');
$res = $qb->getQuery()->getSingleScalarResult();
return new Response((string) $res);
}
}
?>
Результат выполнения кода:
"5"
Пример
Давайте подсчитаем количество уникальных значений поля title, передав второй параметр true:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select($qb->expr()->count('a.title', true))
->from(Article::class, 'a');
$res = $qb->getQuery()->getSingleScalarResult();
return new Response((string) $res);
}
}
?>
Результат выполнения кода:
"3"
Пример
Давайте используем метод count вместе с группировкой для подсчёта записей по каждому значению поля:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(EntityManagerInterface $em): Response
{
$qb = $em->createQueryBuilder();
$qb->select('a.status', $qb->expr()->count('a.id'))
->from(Article::class, 'a')
->groupBy('a.status');
$res = $qb->getQuery()->getResult();
return new Response(json_encode($res));
}
}
?>
Результат выполнения кода:
[{"status": "active", "1": "3"}, {"status": "draft", "1": "2"}]