Skip to content
Snippets Groups Projects
HttpFilterEntityRepository.php 1006 B
Newer Older
<?php

declare(strict_types=1);

namespace IQDEV\Packages\DoctrineHttpFilter;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\Request;

abstract class HttpFilterEntityRepository extends EntityRepository implements QueryFilterInterface
{
    /** @inheritDoc */
    public function createQueryByFilter(iterable $filters, ?Request $request = null): QueryBuilder
    {
        $tableAlias = $this->getAliasTableForFilter();
        $queryBuilder = $this->createQueryBuilder($tableAlias);

        /**
         * @var string $field
         * @var string|HttpFilter $filter
         */
        foreach ($filters as $field => $filter) {
            if (! $filter instanceof HttpFilter && is_string($filter)) {
                $filter = new $filter($tableAlias, $field, $request);
            }

            $filter->addToQuery($queryBuilder);
        }

        return $queryBuilder;
    }

    abstract public function getAliasTableForFilter(): string;
}