Метод findBy
Метод findBy класса ServiceEntityRepository
выполняет поиск записей в таблице базы данных
по переданным критериям. Первым параметром
передаётся массив условий вида ['поле' => 'значение'].
Вторым параметром можно передать сортировку,
третьим - лимит, четвёртым - смещение.
Метод возвращает массив найденных сущностей.
Синтаксис
<?php
public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array
?>
Пример
Давайте найдём все статьи с полем status равным 'active'.
Сначала создадим сущность 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(length: 255)]
private ?string $status = 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 getStatus(): ?string
{
return $this->status;
}
public function setStatus(string $status): static
{
$this->status = $status;
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);
}
}
?>
Теперь вызовем метод findBy в контроллере:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(ArticleRepository $repo): Response
{
$res = $repo->findBy(['status' => 'active']);
$titles = [];
foreach ($res as $article) {
$titles[] = $article->getTitle();
}
return new Response(implode(', ', $titles));
}
}
?>
Результат выполнения кода:
"article 1, article 2"
Пример
Давайте найдём статьи с сортировкой по полю title по возрастанию:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/articles/sorted', name: 'article_sorted')]
public function sorted(ArticleRepository $repo): Response
{
$res = $repo->findBy(['status' => 'active'], ['title' => 'ASC']);
$titles = [];
foreach ($res as $article) {
$titles[] = $article->getTitle();
}
return new Response(implode(', ', $titles));
}
}
?>
Результат выполнения кода:
"article 1, article 2, article 3"
Пример
Давайте ограничим выборку двумя записями с пропуском первой:
<?php
namespace AppController;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/articles/limited', name: 'article_limited')]
public function limited(ArticleRepository $repo): Response
{
$res = $repo->findBy(['status' => 'active'], null, 2, 1);
$titles = [];
foreach ($res as $article) {
$titles[] = $article->getTitle();
}
return new Response(implode(', ', $titles));
}
}
?>
Результат выполнения кода:
"article 2, article 3"
Смотрите также
-
класс
ServiceEntityRepository,
который является базовым классом для репозиториев -
метод
find,
который ищет одну запись по идентификатору -
метод
findOneBy,
который ищет одну запись по критериям -
метод
findAll,
который возвращает все записи таблицы