Как удалить некоторые значения из коллекции при использовании ресурса Laravel API
Я веду блог-проект. У меня есть этот ресурс API для моей модели Post
return [
'id' => $this->id,
'title' => $this->title,
'body' => $this->body,
'date' => $this->date
];
но я не хочу получать 'body' => $this->body
когда я получаю сборник сообщений, потому что я использую его только тогда, когда я хочу показать сообщение, а не для их перечисления
Как я могу это сделать? я должен использовать коллекции ресурсов?
ОБНОВИТЬ:makeHidden
должно работать, но это не так, потому что у нас есть Illuminate\Support\Collection
вместо того Illuminate\Database\Eloquent\Collection
, как я могу сделать приведение или заставить метод сбора ресурсов API возвращать Illuminate\Database\Eloquent\Collection
пример?
2 ответа
Я полагаю, у тебя есть PostResource
, если вы этого не сделаете, вы можете создать его:
php artisan make:resource PostResource
Переопределить метод сбора на PostResource
и поля фильтра:
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
]);
}
}
Вам нужно создать PostResourceCollection
php artisan make:resource --collection PostResourceCollection
Здесь коллекция обрабатывается со скрытым полем (ями)
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();
}
}
Сейчас в PostController
вы можете позвонить в hide
метод с полем, которое нужно скрыть:
public function index()
{
$posts = Post::all();
return PostResource::collection($posts)->hide(['body']);
}
У вас должна получиться коллекция сообщений без поля body.
Существует метод условного добавления атрибута к ресурсу, как показано ниже.
return [
'attribute' => $this->when(Auth::user()->isAdmin(), 'attribute-value'),
];
Я надеюсь, что это поможет вам