Ресурсы Laravel Eloquent API: удалить ключ "data" из ответа (коллекции)

У меня есть ресурс 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"
    }
]

1 ответ

Решение

Чтобы получить все данные, просто используйте ->all()

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

Вы можете увидеть больше в официальном документе о коллекциях, где объясняется, что использованиеall() дает вам базовый массив, представленный коллекцией.

Если вы хотите использовать собственный ключ вместо данных, вы можете определить атрибут $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';
    }

Если вы хотите отключить ключ "data" вместо data, вы можете определить атрибут $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

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