json-api icon indicating copy to clipboard operation
json-api copied to clipboard

Clarification for how to use with many to many

Open roarkmccolgan opened this issue 1 year ago • 4 comments

Hi All.

I am returning a collection of orders with their products (many to many) and each order can have the same product. I would like to know the pivot table data to know how many of the product was for each order.

However in relationships I only get the type "products" and the id.

In the included property, I only get one instance of that product and the pivot data (ordered_qty, received_qty etc) only relates to one of the orders.

I have 2 orders: SPR0004 and SPR0005 they both have a product chocolate croissant, how can I get the ordered qty of them for each order?

{
  "data": [
    {
      "id": "4",
      "type": "orders",
      "attributes": {
        "ref": "SPR00004",
        "status": "dispatched",
        "requested_delivery": "2024-01-25T06:23:40.000000Z",
        "created_at": "2023-07-13T22:23:40.000000Z"
      },
      "relationships": {
        "products": {
          "data": [
            {
              "type": "products",
              "id": "1"
            }
          ]
        },
      }
    },
    {
      "id": "5",
      "type": "orders",
      "attributes": {
        "ref": "SPR00005",
        "status": "dispatched",
        "requested_delivery": "2024-01-25T22:51:09.000000Z",
        "created_at": "2023-07-13T22:51:09.000000Z"
      },
      "relationships": {
        "products": {
          "data": {
            "0": {
              "type": "products",
              "id": "46"
            },
            "2": {
              "type": "products",
              "id": "1"
            }
          }
        },
      }
    }
  ],
  "included": [
    {
      "id": "1",
      "type": "products",
      "attributes": {
        "name": "Chocolate Croissant",
        "slug": "chocolate-croissant",
        "description": null,
        "order_id": 4,
        "ordered_qty": 2,
        "dispatched_qty": 0,
        "delivered_qty": 0
      }
    },
    {
      "id": "46",
      "type": "products",
      "attributes": {
        "name": "Prawn Rissoles",
        "slug": "prawn-rissoles",
        "description": null,
        "order_id": 5,
        "ordered_qty": 2,
        "dispatched_qty": 0,
        "delivered_qty": 0
      }
    }
  ],
  "jsonapi": {
    "version": "1.0"
  }
}

Thank you very much for your assistance!

roarkmccolgan avatar Feb 05 '24 09:02 roarkmccolgan

Hey, did you find a fix for this one? I have the same issue.

lamouize-act avatar Jun 12 '24 21:06 lamouize-act

Hi!

Unfortunately not, I ended up using Laravel built in resources very similar in implementation but found it easier to use. https://laravel.com/docs/11.x/eloquent-resources#generating-resources Thanks

roarkmccolgan avatar Jun 13 '24 10:06 roarkmccolgan

@roarkmccolgan so u ends up with not using JsonApiResource for many-to-many relationships ??

Mohammed-Alama avatar Aug 07 '24 02:08 Mohammed-Alama

in src/JsonApiResourceCollection.php adding ->values() seems to do the trick, but it's unclear if this is always what we want there, don't have time to look further at the moment.

    private function resolveResourceIdentifiers(Request $request)
    {
        return $this->collection
            ->uniqueStrict(fn (JsonApiResource $resource): array => $resource->uniqueKey($request))
            ->map(fn (JsonApiResource $resource): ResourceIdentifier => $resource->resolveResourceIdentifier($request))
            ->values()
        ;
    }

ActualFab avatar Mar 11 '25 19:03 ActualFab