2

I need your help!

I'm having problems returning pivot table information when using ApiResources.

If I have a model like this:

Post.php

public function likes()
{
    return $this->belongsToMany(Like::class)
        ->withPivot(['points']) // I want this in my PostResource::collection !
}

When defining its Resources:

LikeResource.php

public function toArray($request)
{
    return [
        'like_field' => $this->like_field
    ];
}

PostResource.php

public function toArray($request)
{
    return [ 
        'title' => $this->title,
        'likes' => LikeResource::collection($this->whenLoaded('likes'))
    ];
}

Then in PostController.php

return PostResource::collection(Post::with('likes')->get())

It will return something like this:

Controller Response

[
    {
        'title' => 'Post 1'
        'likes' => [
            {
                'like_field' => 'Test'
            },
            {
                'like_field' => 'Test 2'
            }
        ]
    },
    {
        'title' => 'Post 2',
        ...
    }
]

The problem is, using that LikeResource::collection() it does not appends pivot information. How could I add 'points' of the pivot table when defining that PostResource??

Thats all, Thx!

Solution

Well, simply reading a bit in Laravel Docs, to return pivot information you just has to use the method $this->whenPivotLoaded()

So, the PostResource becomes:

public function toArray($request)
{
    return [ 
        'title' => $this->title,
        'likes' => LikeResource::collection($this->whenLoaded('likes')),
        'like_post' => $this->whenPivotLoaded('like_post', function() {
            return $this->pivot->like_field;
        })
    ];
}
Zalo
  • 642
  • 12
  • 24

0 Answers0