diff --git a/src/Filters.php b/src/Filters.php index e8ae2d5..ebfd0f0 100644 --- a/src/Filters.php +++ b/src/Filters.php @@ -4,6 +4,8 @@ namespace Arxy\DoctrineORMFilters; +use Doctrine\ORM\NonUniqueResultException; +use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; use InvalidArgumentException; @@ -12,10 +14,17 @@ use function is_array; use function is_callable; +/** + * @template T of string + * @template V of object + */ trait Filters { private array $filters; + /** + * @return array + */ abstract public function getFilters(): array; private function createFilters(): array @@ -27,7 +36,10 @@ private function createFilters(): array return $this->filters; } - private function getFilter($name): callable + /** + * @param T $name + */ + private function getFilter(string $name): callable { $this->createFilters(); @@ -41,6 +53,9 @@ private function getFilter($name): callable /** @return QueryBuilder */ abstract public function createQueryBuilder($alias, $indexBy = null); + /** + * @param iterable $filterBy + */ public function createQueryBuilderByFilters(string $alias, iterable $filterBy, string $indexBy = null): QueryBuilder { $queryBuilder = $this->createQueryBuilder($alias, $indexBy); @@ -56,6 +71,9 @@ public function createQueryBuilderByFilters(string $alias, iterable $filterBy, s return $queryBuilder; } + /** + * @param T $filterName + */ public function appendFilter(QueryBuilder $queryBuilder, string $alias, string $filterName, ...$values): bool { if (isset($queryBuilder->filters[$filterName])) { @@ -72,21 +90,39 @@ public function appendFilter(QueryBuilder $queryBuilder, string $alias, string $ return $queryBuilder->filters[$filterName] = true; } + /** + * @param iterable $filterBy + * @return V | null + * @throws NonUniqueResultException + */ public function findOneByFilters(iterable $filterBy): ?object { return $this->createQueryBuilderByFilters('entity', $filterBy)->getQuery()->getOneOrNullResult(); } + /** + * @param iterable $filterBy + * @return V[] + */ public function findByFilters(iterable $filterBy): array { return $this->createQueryBuilderByFilters('entity', $filterBy)->getQuery()->getResult(); } + /** + * @param iterable $filterBy + * @return V + * @throws NonUniqueResultException + * @throws NoResultException + */ public function getSingleResultByFilters(iterable $filterBy): object { return $this->createQueryBuilderByFilters('entity', $filterBy)->getQuery()->getSingleResult(); } + /** + * @param iterable $filterBy + */ public function countByFilters(iterable $filterBy): int { return (int)$this diff --git a/src/HasFilters.php b/src/HasFilters.php index d2a7548..cf0fcfd 100644 --- a/src/HasFilters.php +++ b/src/HasFilters.php @@ -8,6 +8,9 @@ use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; +/** + * @template V of object + */ interface HasFilters { public function createQueryBuilderByFilters( @@ -19,13 +22,18 @@ public function createQueryBuilderByFilters( public function appendFilter(QueryBuilder $queryBuilder, string $alias, string $filterName, ...$values): bool; /** + * @return V | null * @throws NonUniqueResultException */ public function findOneByFilters(iterable $filterBy): ?object; + /** + * @return V[] + */ public function findByFilters(iterable $filterBy): array; /** + * @return V * @throws NoResultException * @throws NonUniqueResultException */