Метод matching
Метод matching класса ServiceEntityRepository
выполняет поиск сущностей по заданным критериям
и возвращает результат в виде массива.
Первым параметром передаётся массив критериев
(пары 'поле' => 'значение'). Вторым параметром
можно передать сортировку, а третьим - лимит
и смещение для ограничения выборки.
Метод является удобной альтернативой findBy,
когда нужна дополнительная фильтрация на уровне
запросов или нестандартная сортировка.
Синтаксис
public function matching(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array
Пример
Давайте найдём все статьи с полем status равным 'published':
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findPublished(): array
{
return $this->matching([
'status' => 'published',
]);
}
}
?>
Результат выполнения метода findPublished:
[
Article { id: 1, title: 'article 1', status: 'published' },
Article { id: 2, title: 'article 2', status: 'published' },
Article { id: 3, title: 'article 3', status: 'published' }
]
Пример
Давайте отсортируем результат по полю createdAt по убыванию:
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findLatestPublished(): array
{
return $this->matching(
['status' => 'published'],
['createdAt' => 'DESC']
);
}
}
?>
Результат выполнения метода findLatestPublished:
[
Article { id: 3, title: 'article 3', status: 'published', createdAt: '2024-03-15' },
Article { id: 2, title: 'article 2', status: 'published', createdAt: '2024-02-10' },
Article { id: 1, title: 'article 1', status: 'published', createdAt: '2024-01-05' }
]
Пример
Давайте ограничим выборку тремя записями:
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findTopThree(): array
{
return $this->matching(
['status' => 'published'],
['createdAt' => 'DESC'],
3
);
}
}
?>
Результат выполнения метода findTopThree:
[
Article { id: 3, title: 'article 3', status: 'published' },
Article { id: 2, title: 'article 2', status: 'published' },
Article { id: 1, title: 'article 1', status: 'published' }
]
Пример
Давайте найдём статьи с полем status равным 'published'
и полем author равным 'user':
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findByAuthor(): array
{
return $this->matching([
'status' => 'published',
'author' => 'user',
]);
}
}
?>
Результат выполнения метода findByAuthor:
[
Article { id: 1, title: 'article 1', status: 'published', author: 'user' },
Article { id: 2, title: 'article 2', status: 'published', author: 'user' }
]
Смотрите также
-
класс
ServiceEntityRepository,
который является базовым классом репозитория -
метод
findBy,
который ищет сущности по критериям -
метод
findOneBy,
который возвращает одну сущность по критериям -
метод
createQueryBuilder,
который создаёт построитель запросов