API平台按空值过滤

CHR*_*COM 5 api symfony api-platform.com

我正在寻找一种解决方案来根据为空的参数(用户)恢复 get 中的数据:

    {
  "@context": "\/api\/contexts\/ShippingCost",
  "@id": "\/api\/shipping_costs",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "\/api\/shipping_costs\/1",
      "@type": "ShippingCost",
      "id": 1,
      "minWeight": 0,
      "maxWeight": 251,
      "france": 4.87,
      "domTom": 4.21,
      "aerial": 3.84,
      "zone": {
        "@id": "\/api\/zones\/1",
        "@type": "Zone",
        "id": 1,
        "name": "Guadeloupe",
        "TaxFOB": 35,
        "TaxSurete": 0.2,
        "TaxFuel": 0.77,
        "TaxGuerre": 0.24,
        "Lta": 0,
        "InfoDouane": 24,
        "CreditEnlevement": 0,
        "EntreposageCci": 0.4,
        "EntreposageCciMin": 15,
        "RemiseDoc": 43,
        "Surete": 0,
        "AvanceFond": 0,
        "Tid": 13,
        "Spia": 10,
        "InterTransite": 50
      },
      "user": null
    },
{
      "@id": "\/api\/shipping_costs\/162",
      "@type": "ShippingCost",
      "id": 162,
      "minWeight": 0,
      "maxWeight": 250,
      "france": 3,
      "domTom": 5,
      "aerial": 4,
      "zone": {
        "@id": "\/api\/zones\/4",
        "@type": "Zone",
        "id": 4,
        "name": "Guyane",
        "TaxFOB": 30,
        "TaxSurete": 0.2,
        "TaxFuel": 0.77,
        "TaxGuerre": 0.24,
        "Lta": 34.1,
        "InfoDouane": 24,
        "CreditEnlevement": 0,
        "EntreposageCci": 0.4,
        "EntreposageCciMin": 6,
        "RemiseDoc": 34.5,
        "Surete": 0,
        "AvanceFond": 0,
        "Tid": 0,
        "Spia": 0,
        "InterTransite": 10
      },
      "user": "\/api\/customers\/153"
    },
Run Code Online (Sandbox Code Playgroud)

目前它检索表中的所有数据,而我只想在 GET 中恢复 user = null 的所有数据

您知道 API 平台需要哪些参数才能执行此操作吗?

我的实体:

    /**
 * @ApiResource(
 *     attributes={"pagination_enabled"=false},
 *     collectionOperations={
 *      "get"={
 *             "method"="GET",
 *             "normalization_context"={"groups"={"shippingGet", "shippingGetCollection"}},
 *             "access_control"="is_granted('ROLE_ADMIN') or is_granted('ROLE_CUSTOMER')"
 *         },
 *         "getCustomPrices"={
 *             "method"="GET",
 *             "normalization_context"={"groups"={"shippingGetCustomPrice"}},
 *             "access_control"="is_granted('ROLE_ADMIN') or is_granted('ROLE_CUSTOMER')",
 *              "path"="/shipping_costs/{userId}/customPrices",
 *             "route_name"="get_shipping_costs_userid",
 *             "controller"="App\Controller\ShippingCostsController",
 *             "swagger_context" = {
 *                         "parameters" = {
 *                             {
 *                                 "name" = "userId",
 *                                 "in" = "query",
 *                                 "description" = "ID customer",
 *                                 "type" : "string",
 *                             }
 *                         }
 *                      }
 *                 },
 *         "post"={
 *             "method"="POST",
 *             "normalization_context"={"groups"={"shippingPost"}},
 *             "access_control"="is_granted('ROLE_ADMIN')"
 *         }
 *     },
 *     itemOperations={
 *         "getItem"={
 *             "method"="GET",
 *             "normalization_context"={"groups"={"shippingGet", "shippingGetItem"}},
 *             "access_control"="is_granted('ROLE_ADMIN') or is_granted('ROLE_CUSTOMER')"
 *         },
 *         "delete"={
 *             "method"="DELETE",
 *             "normalization_context"={"groups"={"shippingDelete"}},
 *             "access_control"="is_granted('ROLE_ADMIN')"
 *         },
 *         "put"={
 *             "method"="PUT",
 *             "normalization_context"={"groups"={"shippingPost"}},
 *             "access_control"="is_granted('ROLE_ADMIN')"
 *         }
 *     }
 * )
 * @ORM\Entity(repositoryClass="App\Repository\ShippingCostRepository")
 */
class ShippingCost
{
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

Met*_*ass 12

存在过滤器允许您根据可为空的字段值选择项目。”

您可以将存在过滤器添加到实体类中,如下所示:

// ..
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter;

/**
 * @ApiResource(
 * ..
 * )
 * @ApiFilter(ExistsFilter::class, properties={"user"})
 */
class ShippingCost
Run Code Online (Sandbox Code Playgroud)

然后你可以用类似的方法来获取它们:

https://localhost:8443/api/shipping_costs?exists[用户]=false。

过滤器在所有 collectionOperations 的默认 DataProvider 上工作,使用带有 @ApiFilter 标记的实体类型的 GET 方法。它是否也适用于您的操作“getCustomPrices”取决于您的控制器使用提供的数据的情况。但因为它在你的 ApiResource 标签中的配置不包含“read”= false 我猜它是包含的。