当使用API-Platform和Hydra:totalItems进行全局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;
// ...
}
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;
}
}
services:
App\DataProvider\UserDataProvider:
arguments:
- '@doctrine.orm.entity_manager'
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过滤器/扩展,并正确地获取分组后的结果。