【问题标题】:Laravel Eloquent API Resources: remove "data" key from response (collection)Laravel Eloquent API 资源:从响应(集合)中删除“数据”键
【发布时间】:2020-06-25 06:39:24
【问题描述】:

我有 Eloquent API 资源 UserResource。当我尝试运行类似这样的代码时:

$users = User::paginate(10);
return UserResource::collection($users);

响应将是这样的:

{
    "data": [
        {
            "name": "Fatima Conroy",
            "email": "ocie.stark@example.org"
        },
        {
            "name": "John Doe",
            "email": "john.doe@example.org"
        }
    ]
}

如何删除 data 键或将其重命名以获得类似此响应的内容?

[
    {
        "name": "Fatima Conroy",
        "email": "ocie.stark@example.org"
    },
    {
        "name": "John Doe",
        "email": "john.doe@example.org"
    }
]

【问题讨论】:

    标签: php laravel laravel-7 laravel-eloquent-resource


    【解决方案1】:

    要获取所有数据,只需使用->all()

    UserResource::collection($users)->all()
    

    您可以在 official doc about collections 中看到更多信息,其中解释了使用 all() 可以获得由集合表示的底层数组。

    【讨论】:

    • 酷!我还可以使用UserResource::collection($users)->values() 删除基于字符串的键。谢谢!
    【解决方案2】:

    如果您想使用自定义键而不是数据,您可以在资源类上定义 $wrap 属性:

    <?php
        
        namespace App\Http\Resources;
        
        use Illuminate\Http\Resources\Json\JsonResource;
        
        class User extends JsonResource
        {
            /**
             * The "data" wrapper that should be applied.
             *
             * @var string
             */
            public static $wrap = 'user';
        }
    

    如果您想禁用“数据”键而不是数据,您可以在资源类上定义 $wrap = null 属性:

    <?php
            
            namespace App\Http\Resources;
            
            use Illuminate\Http\Resources\Json\JsonResource;
            
            class User extends JsonResource
            {
                /**
                 * The "data" wrapper that should be applied.
                 *
                 * @var string
                 */
                public static $wrap = null;
            }
    

    如果您想禁用最外层资源的包装,您可以在基础资源类上使用 withoutWrapping 方法。通常,您应该从您的 AppServiceProvider 或其他服务提供者调用此方法,该服务提供者会在对您的应用程序的每个请求中加载:

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Http\Resources\Json\JsonResource;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            JsonResource::withoutWrapping(); // This command removes "data" key from all classes extended from "JsonResource"
    
            user::withoutWrapping(); // This command removes "data" key from only "user"
    
    
        }
    }
    

    您也可以参考以下官方链接了解更多信息: https://laravel.com/docs/8.x/eloquent-resources#data-wrapping

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 1970-01-01
      • 2023-03-12
      • 2020-01-05
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多