symfony 匹配两个字段的自定义过滤器

ui7jx7zq  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(124)

我只需要一个匹配两个字段registrationIdhash的API端点。
我在网上找不到任何这样的例子,我只能找到单个匹配、正则表达式匹配、OR子句等。没有一个只是查询数据库以返回匹配两列的行的例子。
我有一个名为registrationhashes的表,在实体中我添加了以下行:
#[ApiFilter(RegistrationSearchFilter::class, properties: ['registrationId', 'hash'])]
然后,我已经编写了一个自定义过滤器:

final class RegistrationSearchFilter extends AbstractFilter
{

    protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, Operation $operation = null, array $context = []): void
    {
        if ($property !== 'search') {
            return;
        }

        $alias = $queryBuilder->getRootAliases()[0];
        $queryBuilder->andWhere(sprintf('%s.registrationId = :search AND %s.hash = :hash', $alias, $alias));
    }

    public function getDescription(string $resourceClass): array
    {
        if (!$this->properties) {
            return [];
        }

        $description = [];
        foreach ($this->properties as $property => $strategy) {
            $description["regexp_$property"] = [
                'property' => $property,
                'type' => Type::BUILTIN_TYPE_STRING,
                'required' => false,
                'description' => 'Filter using a regex. This will appear in the OpenApi documentation!',
                'openapi' => [
                    'example' => 'Custom example that will be in the documentation and be the default value of the sandbox',
                    'allowReserved' => false,// if true, query parameters will be not percent-encoded
                    'allowEmptyValue' => true,
                    'explode' => false, // to be true, the type must be Type::BUILTIN_TYPE_ARRAY, ?product=blue,green will be ?product=blue&product=green
                ],
            ];
        }

        return $description;
    }
}

我只是暂时把从其他地方复制来的描述函数放在那里。
但是正如您从WHERE子句中看到的,我需要匹配registrationId AND散列,但是我只有一个值要匹配。
我怎样才能做到这一点?

n6lpvg4x

n6lpvg4x1#

看看搜索过滤器文档,你会看到一个结合两个搜索过滤器的例子。我相信这完成了你的任务,而不需要一个自定义过滤器。

use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;

#[ApiResource]
#[ApiFilter(SearchFilter::class, properties: ['registrationId' => 'exact', 'hash' => 'exact'])]
class RegistrationHash
{
    // ...
}

终点将类似于:
http://localhost:8000/api/registrationhashes?registrationId=10&hash=3C76B43F

相关问题