Commit ca8d9f7b authored by Адлан Шамавов's avatar Адлан Шамавов
Browse files

feat: Реализован сортировка

parent 5e844378
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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;
    }
}
+13 −0
Original line number Diff line number Diff line
@@ -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;
    }
}