I'm learning the Laravel Resource API and have setup my controller to pass the data to my Resource and my Resource Collection.
This is the list of servers (index method) with the show method showing the individual server
Controller
Index method
return new DedicatedServerResourceCollection($product->where('parent_id', 1)->with('dedicatedServers')->get());
Show Method
return new DedicatedServerResource(DedicatedServer::findOrfail($id));
I need to format my collection and resource differently. How can I get my Resource Collection to loop through each item and format the changes accordingly?
Resource Collection
return [
'productTypes' => $this->map(function($data){
return [
'id' => $data->id,
'title' => $data->title,
'tagline' => $data->tagline,
'slug' => $data->slug,
'dedicatedServers' => DedicatedServerResource::collection($this->resource)
// I need to pass 'dedicatedServers' === $this->dedicated_servers
];
})
];
Resource
return [
'id' => $this->id,
'productId' => $this->product_id,
'type' => $this->type,
'price' => $this->price,
'config' => [
'processorLine1' => $this->processor_line_1,
'processorLine2' => $this->processor_line_2,
'memory' => $this->memory,
'storageLine1' => $this->storage_line_1,
'storageLine2' => $this->storage_line_2,
'data' => $this->data,
'benchmark' => [
'benchmark' => $this->benchmark,
'benchmarkPercentage' => $this->benchmark_percentage
]
]
];
CodePudding user response:
You should use either "resource file" or "$this->map(...)", not both.
DedicatedServerResourceCollection extends JsonResource
{
public static $wrap = 'productTypes';
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'tagline' => $this->tagline,
'slug' => $this->slug,
'dedicatedServers' => DedicatedServerResource::collection($this->whenLoaded('dedicated_servers'))
];
}
}
Note: Prefer to use $this->whenLoaded('dedicated_servers') instead of $this->dedicated_servers to avoid n 1 problem.
CodePudding user response:
You might want to create a different resource class for the DedicatedServer model, like SecondDedicatedServerResource.
