我只需要一个匹配两个字段registrationId
和hash
的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散列,但是我只有一个值要匹配。
我怎样才能做到这一点?
1条答案
按热度按时间n6lpvg4x1#
看看搜索过滤器文档,你会看到一个结合两个搜索过滤器的例子。我相信这完成了你的任务,而不需要一个自定义过滤器。
终点将类似于:
http://localhost:8000/api/registrationhashes?registrationId=10&hash=3C76B43F