json-api
json-api copied to clipboard
Clarification for how to use with many to many
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!
Hey, did you find a fix for this one? I have the same issue.
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 so u ends up with not using JsonApiResource for many-to-many relationships ??
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()
;
}