php - Is it possible to use multiple Fractal Transformers in a pagination? -
i have controller returns of users likes. these likes can gig or track. haves used polymorphic relationships accomplish this. both gigs , tracks have own fractal transformer works on own. helpful if returned response likes controller json response containing both gigs , tracks objects within it. hope understand mean here brief example.
the response this:
{ "data": [ { "id": 1, "user_id": 2, "name": "test", "genre": "test", "description": "", "venue": "test", "date": { "date": "-0001-11-30 00:00:00", "timezone_type": 3, "timezone": "utc" }, "lineup": "", "price": "0", "currency": "", "image": false, "attending_count": 0 }, { "id": 2, "user_id": 2, "name": "test", "genre": "test", "description": "", "uri" : "http://example.com/track", }, ], "meta": { "pagination": { "total": 2, "count": 2, "per_page": 50, "current_page": 1, "total_pages": 1, "links": [] } } }
as can see 2 different parts response. nest arrays farther had track: [
, gig: [
. @ later.
here's have far.
$user = user::find($userid); if (! $user){ homecoming $this->respondnotfound("this user not found."); } $arr = []; foreach ($user->likes()->get() $like) { if($like->likeable_type == 'gig'){ $item = new fractal\resource\item($like->likeable, new gigtransformer); } elseif($like->likeable_type == 'track'){ $item = new fractal\resource\item($like->likeable, new tracktransformer); } $arr[] = $item; } $paginator = paginator::make($arr, count($arr), 50); homecoming $paginator;
this returns pagination right count of items no data.
if don't understand have said please leave comment.
many thanks
after working through best part of day have figured out , have learnt quite lot objects , like.
here's have.
$user = user::find($userid); if (! $user){ homecoming $this->respondnotfound("this user not found."); } $obj = new arrayobject(); $fractal = new fractal\manager(); $fractal->setserializer(new fractal\serializer\jsonapiserializer()); foreach ($user->likes()->get() $like) { if($like->likeable_type == 'gig'){ $item = new fractal\resource\item($like->likeable, new gigtransformer, 'gig'); } elseif($like->likeable_type == 'track'){ $item = new fractal\resource\item($like->likeable, new tracktransformer, 'track'); } $obj->append($fractal->createdata($item)->toarray()); } $paginator = paginator::make((array) $obj, $obj->count(), 50); $response = [ 'likes' => (array) $obj, 'meta' => [ 'pagination' => [ 'total' => $paginator->gettotal(), 'count' => $paginator->count(), 'per_page' => $paginator->getperpage(), 'current_page' => $paginator->getcurrentpage(), 'total_pages' => $paginator->getlastpage(), 'links' => $paginator->links(), ], ] ]; homecoming ($this->respond($response));
i should think can see going on here quite easily.
i used arrayobject
maintain fractal item object without type hinting array , still utilize array functions. fractal items appended arrayobject
paginated. wanted display pagination in particular way likes
wrapping user info , meta
wrapping pagination data. respond()
method utilize throughout controllers respond in json format.
hopefully help looking similiar thing. love laravel.
php laravel
No comments:
Post a Comment