在Laravel资源集合中过滤属性

时间:2018-03-14 01:01:27

标签: php laravel laravel-5

在新的Laravel资源类中,您可以根据自己喜欢的任何内容删除属性。

如果要返回许多项目,可以使用

功能
Resource::collection()

但这不允许您在一个地方添加元数据。输入一个集合,很棒,这是一个很好的格式的项目,能够添加元数据。但你不能做的是过滤你必须隐藏属性的集合,就像你可以用资源一样。我能看到的唯一方法是

foreach ($this->collection as $item) {
        if ($notAdmin) {
            $temp = array_except($item->toArray(), ['secret']);
        }
        $temp['links'] = ['self' => route('restaurant.show', [$item])];
        $data[] = $temp;
    }

我有什么遗失的吗?这似乎是资源收集的一个巨大的被忽视的能力

2 个答案:

答案 0 :(得分:3)

基于this线程,似乎在使用ResourceCollection类来自定义集合时(例如BookCollection),Laravel会查找Resource  类命名相同,但没有 Collection sufix类(在示例中,名为just Book的类)。

因此,您需要拥有一个名为Book的资源类,您可以在其中自定义要返回到响应的属性,以及一个名为BookCollection的集合类,它将使用Book - 自定义数据 - 还可以自定义元数据。

应用程序/ HTTP /资源/ book.php中

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class Book extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
        ];
    }
}

应用程序/ HTTP /资源/ BookCollection.php

<?php

namespace App\Http\Resources\Users;

use Illuminate\Http\Resources\Json\ResourceCollection;

class BookCollection extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return $this->collection;
    }

    public function with($request)    
    {
        return [
            'meta' => [
                'key' => 'value',
            ],
        ];
    }
}

答案 1 :(得分:0)

好的,这是你如何做到的:

  1. 为单个资源创建Resource,其中you can很容易拥有条件属性

  2. 为集合创建RCollection,您可以在其中添加meta data

  3. Resource::collection(Model::all)传递到new RCollection()

  4. 像这样(来自我的测试):

    Route::get('users/all', function() {
        return new \App\Http\Resources\Users(
            \App\Http\Resources\UserResource::collection(\App\User::get())
        );
    });
    

    像魅力一样!