Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

API platform filter by null value

I am looking for a solution to recover data in get according to a parameter which is null (user):

    {
  "@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"
    },

Currently it retrieves all the data in the table while I only want to recover in GET all the data where user = null

Did you know what arguments API Platform requires to do this?.

My entity:

 /**
 * @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
{
like image 518
CHRISCOM Avatar asked Jun 17 '26 03:06

CHRISCOM


1 Answers

"The exists filter allows you to select items based on a nullable field value."

You can add exists filters to your Entity class like this:

(with @ annotations):

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

/**
 * @ApiResource(
 * ..
 * )
 * @ApiFilter(ExistsFilter::class, properties={"user"})
 */
class ShippingCost

(With attributes - available since PHP 8):

namespace App\Entity;

use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter;

#[ApiResource]
#[ApiFilter(ExistsFilter::class, properties: ['user'])]
class ShippingCost
{

Then you can fetch them with something like:

https://localhost:8443/api/shipping_costs?exists[user]=false.

Filters work on the default DataProvider of all collectionOperations with method GET of the Entity type with the @ApiFilter annotation or #[ApiFilter attribute. Wheather it will also work on your operation "getCustomPrices" depends on wheater your controller uses the provided data. But because its config in your ApiResource tag does not contain "read"=false i guess it does.

like image 131
MetaClass Avatar answered Jun 19 '26 07:06

MetaClass



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!