Как удалить некоторые значения из коллекции при использовании ресурса 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'),
];

Я надеюсь, что это поможет вам

Другие вопросы по тегам