如何始终在 api-platform GET 操作中过滤特定字段值的集合?
How to always filter a collection on specific field value in api-platform GET operations?
在 GET 操作中,我想从返回的集合中排除我的实体,这些实体的“存档”字段等于“真”。
我希望它成为我的端点(如 /users 或 /companies)的默认设置,我想避免手动添加 URL 过滤器,如 /users?filter[archive]=true
最好的方法是什么?
感谢您的帮助:)
我不得不做类似的事情,我通过将 DoctrineExtension 应用于 Collection 将 WHERE 子句添加到 QueryBuilder 来解决它。
怎么做?
- 定义你的过滤器,我看到你已经有了。
- 将 Doctrine Extension 添加到仅应用于集合,或者如果需要,也可以应用于项目:https://api-platform.com/docs/core/extensions/#custom-doctrine-orm-extension
services:
App\Doctrine\Extension\ArchivedExtension:
tags:
- { name: api_platform.doctrine.orm.query_extension.collection }
- 为您的扩展编写代码。
您可以检查您是否收到某个 "filter"(您的 "filter[archive]=true" 查询参数):如果是,请不要将条件应用到 QueryBuilder,过滤机制将应用您的过滤器ApiPlatform.
您的分机 class 应如下所示:
class ArchivedExtension implements QueryCollectionExtensionInterface
{
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null, array $context = [])
{
$this->addWhere($queryBuilder, $resourceClass, $context);
}
private function addWhere(QueryBuilder $queryBuilder, string $resourceClass, array $context = [])
{
if (MyResource::class !== $resourceClass) {
return;
}
// Search if a "archive" Filter is being requested, if not, apply a restriction to the QueryBuilder
if (array_key_exists('archive', $context['filters'])) {
return;
}
$rootAlias = $queryBuilder->getRootAliases()[0];
$queryBuilder->andWhere(sprintf('%s.archive = :archive', $rootAlias));
$queryBuilder->setParameter('archive', true);
}
}
在 GET 操作中,我想从返回的集合中排除我的实体,这些实体的“存档”字段等于“真”。
我希望它成为我的端点(如 /users 或 /companies)的默认设置,我想避免手动添加 URL 过滤器,如 /users?filter[archive]=true
最好的方法是什么?
感谢您的帮助:)
我不得不做类似的事情,我通过将 DoctrineExtension 应用于 Collection 将 WHERE 子句添加到 QueryBuilder 来解决它。
怎么做?
- 定义你的过滤器,我看到你已经有了。
- 将 Doctrine Extension 添加到仅应用于集合,或者如果需要,也可以应用于项目:https://api-platform.com/docs/core/extensions/#custom-doctrine-orm-extension
services:
App\Doctrine\Extension\ArchivedExtension:
tags:
- { name: api_platform.doctrine.orm.query_extension.collection }
- 为您的扩展编写代码。
您可以检查您是否收到某个 "filter"(您的 "filter[archive]=true" 查询参数):如果是,请不要将条件应用到 QueryBuilder,过滤机制将应用您的过滤器ApiPlatform.
您的分机 class 应如下所示:
class ArchivedExtension implements QueryCollectionExtensionInterface
{
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null, array $context = [])
{
$this->addWhere($queryBuilder, $resourceClass, $context);
}
private function addWhere(QueryBuilder $queryBuilder, string $resourceClass, array $context = [])
{
if (MyResource::class !== $resourceClass) {
return;
}
// Search if a "archive" Filter is being requested, if not, apply a restriction to the QueryBuilder
if (array_key_exists('archive', $context['filters'])) {
return;
}
$rootAlias = $queryBuilder->getRootAliases()[0];
$queryBuilder->andWhere(sprintf('%s.archive = :archive', $rootAlias));
$queryBuilder->setParameter('archive', true);
}
}