如何在API Platform中获取Product实体所有唯一品牌与产品类型列表
实现方案
步骤1:为Product实体添加自定义集合操作
在你的Product实体的@ApiResource注解的collectionOperations配置中新增自定义端点:
/** * @ApiResource( * collectionOperations={ * "get", // 保留原有列表接口 * "get_filters"={ * "method"="GET", * "path"="/products/filters", * "controller"=App\Controller\ProductFilterController::class, * "openapi_context"={ * "summary"="获取产品筛选可用的品牌、类型列表" * } * } * }, * // 保留原有其他ApiResource配置不变 * ) * @ORM\Entity */ class Product { // 原有实体代码完全不变 }
步骤2:创建自定义控制器
在src/Controller目录下新建ProductFilterController.php文件,代码如下:
<?php namespace App\Controller; use App\Repository\ProductRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; class ProductFilterController extends AbstractController { public function __invoke(ProductRepository $productRepository): JsonResponse { $queryResult = $productRepository->createQueryBuilder('p') // 直接查询去重后的品牌名、类型名,数据库层面执行性能更高 ->select('DISTINCT b.name as brand, pt.name as type') ->join('p.idProductModel', 'pm') ->join('pm.idBrand', 'b') ->join('pm.idProductType', 'pt') // 如果不需要排除已软删除的产品,可删除下面这行 ->andWhere('p.deletedAt IS NULL') ->getQuery() ->getScalarResult(); // 整理成要求的返回格式 return new JsonResponse([ 'brands' => array_values(array_unique(array_column($queryResult, 'brand'))), 'types' => array_values(array_unique(array_column($queryResult, 'type'))) ]); } }
注意事项
- 以上代码默认你的
Brand实体存储品牌名称的字段为name,ProductType实体存储类型名称的字段为name,如果实际字段名不同,修改select语句中的对应字段即可 - 该实现直接在数据库层面完成数据筛选和去重,即使产品数据量很大也不会有性能问题
- 如果你需要对接口加权限控制,直接在控制器方法中添加权限校验逻辑即可
内容的提问来源于stack exchange,提问作者Naima
相关产品推荐
相关产品推荐

