I assume you have a PostResource
, if you don't you can generate one:
php artisan make:resource PostResource
Override the collection method on PostResource
and filter fields:
class PostResource extends Resource
{
protected $withoutFields = [];
public static function collection($resource)
{
return tap(new PostResourceCollection($resource), function ($collection) {
$collection->collects = __CLASS__;
});
}
// Set the keys that are supposed to be filtered out
public function hide(array $fields)
{
$this->withoutFields = $fields;
return $this;
}
// Remove the filtered keys.
protected function filterFields($array)
{
return collect($array)->forget($this->withoutFields)->toArray();
}
public function toArray($request)
{
return $this->filterFields([
'id' => $this->id,
'title' => $this->title,
'body' => $this->body,
'date' => $this->date
]);
}
}
You need to create a PostResourceCollection
php artisan make:resource --collection PostResourceCollection
Here the collection is being processed with the hidden field(s)
class PostResourceCollection extends ResourceCollection
{
protected $withoutFields = [];
// Transform the resource collection into an array.
public function toArray($request)
{
return $this->processCollection($request);
}
public function hide(array $fields)
{
$this->withoutFields = $fields;
return $this;
}
// Send fields to hide to UsersResource while processing the collection.
protected function processCollection($request)
{
return $this->collection->map(function (PostResource $resource) use ($request) {
return $resource->hide($this->withoutFields)->toArray($request);
})->all();
}
}
Now in PostController
you can call the hide
method with the field to be hidden:
public function index()
{
$posts = Post::all();
return PostResource::collection($posts)->hide(['body']);
}
You should get a collection of Posts without the body field.