1

我在一个博客项目中。我的 Post 模型有这个 API 资源

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实例?

4

2 回答 2

3

我假设你有一个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 字段的帖子集合。

于 2019-12-05T22:05:50.777 回答
1

有一种方法可以有条件地向资源添加属性,如下所示

return [
    'attribute' => $this->when(Auth::user()->isAdmin(), 'attribute-value'),
];

我希望这能帮到您

于 2019-12-06T06:28:57.593 回答