api-platform.com - 如何始终在 api-platform GET 操作中过滤特定字段值的集合?
问题描述
在 GET 操作中,我想从返回的集合中排除具有等于“true”的“归档”字段的实体。
我希望这成为我的端点(如 /users 或 /companies)的默认值,并且我想避免手动添加 URL 过滤器,例如/users?filter[archive]=true
最好的方法是什么?
谢谢你的帮助 :)
解决方案
我必须做类似的事情,我通过将 DoctrineExtension 应用到一个集合来解决它,该集合会将 WHERE 子句添加到 QueryBuilder。
如何?
- 定义你的过滤器,我看到你已经有了。
- 将 Doctrine Extension 添加到仅适用于 Collections,或者如果您需要,也添加到 Item: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 }
- 编码您的扩展程序。
您可以检查您是否收到某个“过滤器”(您的“过滤器[归档] = true”查询参数):如果是,请不要将条件应用于 QueryBuilder,您的过滤器将被 ApiPlatform 的过滤机制应用。
您的扩展类应如下所示:
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);
}
}
推荐阅读
- angular - 最终构建中存在哪些角度包
- ios - Xcode 未检测库..在范围内找不到 Firebase 'FaceDetectorOptions'
- terraform - 为什么在使用 terraform 自动缩放时缩放未创建的矩阵?
- firebase - 在 FirebaseFirestore 上为许多用户获取 postId
- php - 在php中显示数组中的第一张图片
- terraform - 使用模块时无法创建 Terraform 资源组
- reactjs - Electron - Webview 必须附加到 DOM 错误
- javascript - 如何在openpgp JS中将参数消息作为文本传递
- settings - 本地管理员行为/权限 windows server 2019 os
- javascript - Discord.js 更改频道权限无济于事