Метод count класса ServiceEntityRepository
Метод count класса ServiceEntityRepository
возвращает целое число - количество записей в таблице,
которые удовлетворяют переданным условиям. Первым
параметром передаётся массив критериев отбора
criteria, где ключ - имя поля сущности,
а значение - требуемое значение этого поля.
Метод удобен, когда нужно узнать лишь число строк,
не загружая сами объекты из базы данных.
Синтаксис
public function count(array $criteria = []): int
Пример
Давайте посчитаем общее количество статей в таблице.
Сначала создадим сущность Article:
<?php
namespace AppEntity;
use AppRepositoryArticleRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMColumn(length: 255)]
private ?string $title = null;
#[ORMColumn(type: 'text')]
private ?string $text = null;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): static
{
$this->title = $title;
return $this;
}
public function getText(): ?string
{
return $this->text;
}
public function setText(string $text): static
{
$this->text = $text;
return $this;
}
}
?>
Теперь создадим репозиторий ArticleRepository:
<?php
namespace AppRepository;
use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
}
?>
Вызовем метод count в контроллере,
чтобы получить общее число статей:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/count', name: 'article_count')]
public function count(ArticleRepository $repository): Response
{
$res = $repository->count([]);
return new Response($res);
}
}
?>
Результат выполнения кода при наличии трёх статей:
"3"
Пример
Давайте посчитаем количество статей с определённым заголовком, передав критерий отбора:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/count/title', name: 'article_count_title')]
public function countByTitle(ArticleRepository $repository): Response
{
$res = $repository->count(['title' => 'abcde']);
return new Response($res);
}
}
?>
Результат выполнения кода, если таких статей две:
"2"
Пример
Давайте посчитаем количество статей, у которых одновременно совпадают заголовок и текст:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/count/both', name: 'article_count_both')]
public function countByBoth(ArticleRepository $repository): Response
{
$res = $repository->count([
'title' => 'abcde',
'text' => 'hello',
]);
return new Response($res);
}
}
?>
Результат выполнения кода, если совпадений нет:
"0"
Пример
Давайте получим все статьи и посчитаем их количество
через метод count, сравнив с результатом
метода findAll:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/compare', name: 'article_compare')]
public function compare(ArticleRepository $repository): Response
{
$count = $repository->count([]);
$all = $repository->findAll();
$res = count($all) === $count ? 'equal' : 'different';
return new Response($res);
}
}
?>
Результат выполнения кода:
"equal"
Смотрите также
-
класс
ServiceEntityRepository,
который является базовым классом репозитория -
метод
findAll,
который возвращает все записи таблицы -
метод
findBy,
который возвращает записи по критериям отбора -
метод
matching,
который возвращает записи по критериям с сортировкой и лимитом