Loading src/HttpFilterEntityRepository.php +16 −0 Original line number Diff line number Diff line Loading @@ -29,4 +29,20 @@ class HttpFilterEntityRepository extends EntityRepository implements QueryFilter return $queryBuilder; } public function createQueryForSort( string $field, string $tableAlias, Request $request, ?QueryBuilder $queryBuilder = null ): QueryBuilder { if ($queryBuilder === null) { $queryBuilder = $this->createQueryBuilder($tableAlias); } $sort = new HttpSort($tableAlias, $field, $request); $sort->addToQuery($queryBuilder); return $queryBuilder; } } src/HttpFilterTrait.php +13 −0 Original line number Diff line number Diff line Loading @@ -28,5 +28,18 @@ trait HttpFilterTrait return $this->repository->createQueryByFilter($filters, $this->getAliasTableForFilter(), $request); } final public function createQueryForSort(Request $request, ?QueryBuilder $queryBuilder = null): QueryBuilder { if (! isset($this->repository)) { $this->repository = new HttpFilterEntityRepository( $this->getEntityManager(), new ClassMetadata($this->getClassName()) ); } $field = array_key_first($request->query->getIterator()[HttpSort::REQUEST_SORT_KEY]); return $this->repository->createQueryForSort($field, $this->getAliasTableForFilter(), $request, $queryBuilder); } abstract public function getAliasTableForFilter(): string; } src/HttpSort.php 0 → 100644 +53 −0 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace IQDEV\Packages\DoctrineHttpFilter; use Doctrine\ORM\QueryBuilder; use Symfony\Component\HttpFoundation\Request; class HttpSort { public const string REQUEST_SORT_KEY = 'sort'; public const array SORT_DIRECTIONS = ['DESC', 'ASC']; protected Request $request; public function __construct( protected string $tableAlias, protected string $field, ?Request $request = null, ) { $this->request = $request ?? Request::createFromGlobals(); } protected function getColumn(): string { return $this->tableAlias . '.' . $this->field; } protected function getHttpValue(): mixed { $filter = $this ->request ->query ->getIterator()[static::REQUEST_SORT_KEY] ?? null; if ($filter === null) { return null; } return $filter[$this->field] ?? null; } public function addToQuery(QueryBuilder $queryBuilder): QueryBuilder { if (in_array($this->getHttpValue(), self::SORT_DIRECTIONS, true)) { $queryBuilder->orderBy($this->getColumn(), $this->getHttpValue()); } return $queryBuilder; } } Loading
src/HttpFilterEntityRepository.php +16 −0 Original line number Diff line number Diff line Loading @@ -29,4 +29,20 @@ class HttpFilterEntityRepository extends EntityRepository implements QueryFilter return $queryBuilder; } public function createQueryForSort( string $field, string $tableAlias, Request $request, ?QueryBuilder $queryBuilder = null ): QueryBuilder { if ($queryBuilder === null) { $queryBuilder = $this->createQueryBuilder($tableAlias); } $sort = new HttpSort($tableAlias, $field, $request); $sort->addToQuery($queryBuilder); return $queryBuilder; } }
src/HttpFilterTrait.php +13 −0 Original line number Diff line number Diff line Loading @@ -28,5 +28,18 @@ trait HttpFilterTrait return $this->repository->createQueryByFilter($filters, $this->getAliasTableForFilter(), $request); } final public function createQueryForSort(Request $request, ?QueryBuilder $queryBuilder = null): QueryBuilder { if (! isset($this->repository)) { $this->repository = new HttpFilterEntityRepository( $this->getEntityManager(), new ClassMetadata($this->getClassName()) ); } $field = array_key_first($request->query->getIterator()[HttpSort::REQUEST_SORT_KEY]); return $this->repository->createQueryForSort($field, $this->getAliasTableForFilter(), $request, $queryBuilder); } abstract public function getAliasTableForFilter(): string; }
src/HttpSort.php 0 → 100644 +53 −0 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace IQDEV\Packages\DoctrineHttpFilter; use Doctrine\ORM\QueryBuilder; use Symfony\Component\HttpFoundation\Request; class HttpSort { public const string REQUEST_SORT_KEY = 'sort'; public const array SORT_DIRECTIONS = ['DESC', 'ASC']; protected Request $request; public function __construct( protected string $tableAlias, protected string $field, ?Request $request = null, ) { $this->request = $request ?? Request::createFromGlobals(); } protected function getColumn(): string { return $this->tableAlias . '.' . $this->field; } protected function getHttpValue(): mixed { $filter = $this ->request ->query ->getIterator()[static::REQUEST_SORT_KEY] ?? null; if ($filter === null) { return null; } return $filter[$this->field] ?? null; } public function addToQuery(QueryBuilder $queryBuilder): QueryBuilder { if (in_array($this->getHttpValue(), self::SORT_DIRECTIONS, true)) { $queryBuilder->orderBy($this->getColumn(), $this->getHttpValue()); } return $queryBuilder; } }