gpt4 book ai didi

api-platform.com - 如何在 api-platform GET 操作中始终过滤特定字段值的集合?

转载 作者:行者123 更新时间:2023-12-03 23:10:48 35 4
gpt4 key购买 nike

在 GET 操作中,我想从返回的集合中排除具有等于“true”的“存档”字段的实体。

我希望这是我的端点(如/users 或/companies)的默认设置,并且我想避免手动添加 URL 过滤器,如 /users?filter[archive]=true
什么是最好的方法呢?

谢谢你的帮助 :)

最佳答案

我不得不做类似的事情,我通过将 DoctrineExtension 应用于集合来解决它,该集合会将 WHERE 子句添加到 QueryBuilder。

如何?

  • 定义你的过滤器,我看到你已经有了。
  • 将 Doctrine 扩展添加到仅应用于集合,或者如果需要,也可以应用于项目: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[archive]=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);
    }
    }

    关于api-platform.com - 如何在 api-platform GET 操作中始终过滤特定字段值的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57761690/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com