api-platform hydra:totalItems的全局groupBy过滤器/扩展有问题
创始人
2024-09-07 04:30:42
0

当使用API-Platform和Hydra:totalItems进行全局groupBy过滤器/扩展时,可能会出现一些问题。下面是一个可能的解决方法,其中包含代码示例:

  1. 确保在你的实体类(例如User)中定义了正确的groupBy注解。例如,如果你想按照用户的地理位置进行分组,可以这样定义:
use ApiPlatform\Core\Annotation\ApiProperty;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class User
{
    // ...

    /**
     * @ORM\Column(type="string")
     * @ApiProperty(identifier=true)
     */
    private $id;

    // ...

    /**
     * @ORM\Column(type="string")
     * @ApiProperty(
     *     attributes={
     *         "swagger_context"={
     *             "type"="string",
     *             "description"="Group by location"
     *         }
     *     }
     * )
     */
    private $location;

    // ...
}
  1. 在你的API资源类(例如UserResource)中,定义一个自定义的数据提供器(DataProvider)来处理groupBy过滤器/扩展。你可以使用Doctrine ORM来执行特定的查询。例如:
use ApiPlatform\Core\DataProvider\ContextAwareCollectionDataProviderInterface;
use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\Expr\GroupBy;
use Doctrine\ORM\QueryBuilder;

class UserDataProvider implements ContextAwareCollectionDataProviderInterface, RestrictedDataProviderInterface
{
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
    {
        return User::class === $resourceClass && null === $operationName;
    }

    public function getCollection(string $resourceClass, string $operationName = null, array $context = []): iterable
    {
        // 获取groupBy参数
        $groupBy = $context['filters']['hydra:totalItems']['groupBy'] ?? null;
        if (null === $groupBy) {
            return [];
        }

        // 执行查询
        $queryBuilder = $this->entityManager->createQueryBuilder();
        $queryBuilder->select('u')->from(User::class, 'u')->groupBy('u.' . $groupBy);
        $query = $queryBuilder->getQuery();
        $results = $query->getResult();

        return $results;
    }
}
  1. 在你的服务配置文件(例如services.yaml)中,将自定义的数据提供器添加为服务:
services:
    App\DataProvider\UserDataProvider:
        arguments:
            - '@doctrine.orm.entity_manager'
  1. 最后,在你的API资源类中,将自定义的数据提供器应用到对应的操作中。例如:
use ApiPlatform\Core\Annotation\ApiResource;

/**
 * @ApiResource(
 *     collectionOperations={
 *         "get"={
 *             "method"="GET",
 *             "path"="/users",
 *             "controller"=UserDataProvider::class,
 *             "defaults"={
 *                 "_api_receive"=false,
 *                 "_api_respond"=true
 *             }
 *         }
 *     },
 *     itemOperations={},
 *     shortName="User"
 * )
 */
class UserResource
{
    // ...
}

通过执行以上步骤,你应该能够使用API-Platform和Hydra:totalItems的全局groupBy过滤器/扩展,并正确地获取分组后的结果。

相关内容

热门资讯

记者揭秘!智星菠萝辅助(透视辅... 记者揭秘!智星菠萝辅助(透视辅助)拱趴大菠萝辅助神器,扑克教程(有挂细节);模式供您选择,了解更新找...
一分钟揭秘!约局吧能能开挂(透... 一分钟揭秘!约局吧能能开挂(透视辅助)hhpoker辅助靠谱,2024新版教程(有挂教学);约局吧能...
透视辅助!wepoker模拟器... 透视辅助!wepoker模拟器哪个好用(脚本)hhpoker辅助挂是真的,科技教程(有挂技巧);囊括...
透视代打!hhpkoer辅助器... 透视代打!hhpkoer辅助器视频(辅助挂)pokemmo脚本辅助,2024新版教程(有挂教程);风...
透视了解!约局吧德州真的有透视... 透视了解!约局吧德州真的有透视挂(透视脚本)德州局HHpoker透视脚本,必胜教程(有挂分析);亲,...
六分钟了解!wepoker挂底... 六分钟了解!wepoker挂底牌(透视)德普之星开辅助,详细教程(有挂解密);德普之星开辅助是一种具...
9分钟了解!wpk私人辅助(透... 9分钟了解!wpk私人辅助(透视)hhpoker德州透视,插件教程(有挂教学);风靡全球的特色经典游...
推荐一款!wepoker究竟有... 推荐一款!wepoker究竟有透视(脚本)哈糖大菠萝开挂,介绍教程(有挂技术);囊括全国各种wepo...
每日必备!wepoker有人用... 每日必备!wepoker有人用过(脚本)wpk有那种辅助,线上教程(有挂规律);wepoker有人用...
玩家必备教程!wejoker私... 玩家必备教程!wejoker私人辅助软件(脚本)哈糖大菠萝可以开挂,可靠技巧(有挂神器)申哈糖大菠萝...