Изменение имен ключей при использовании ресурсов laravel для возврата данных API

Итак, я сейчас создаю API и вижу, что laravel добавил ресурс API, который, как я полагаю, заменяет нечто вроде фрактала?

Однако возникает проблема, когда при возврате коллекции с использованием ресурса XyzCollection у меня нет возможности изменять имена БД? Таким образом, я получаю то же соглашение об именах, что и в моей БД.

Множество очевидных причин, почему я не хочу, чтобы это было так (я могу в них разобраться, если потребуется) ОДНАКО - есть ли способ изменить эти ключевые имена?

например, в одной из моих таблиц у меня есть id, uuid, user_uuid. Теперь во фрактале я бы просто преобразовал эти поля так:

'id' => $xyz->uuid, 
'user' => [
    'data' => [
        [
        'user_id' => $xyz->user->uuid,
        'username' => $xyz->user->username,
        ]
    ]
],

Как мне это сделать, когда все, что я могу сделать, это передать коллекцию в коллекцию XyzCollection?

'data' => $this->collection,

и прежде чем сказать, используйте XyzResource ... Когда я возвращаю all(); такие записи, как мне нужно делать много раз в API (или разбивать на страницы) и т. д. и т. д. Я могу сделать это только из XyzCollection!

заранее спасибо

Стив

1 ответ

Решение

Сначала вам нужно определить структуру для отдельного объекта JsonResource:

(php artisan make:resource Xyz)

public function toArray($request)
{
    return [
        'user_id' => $this->uuid,
        'username' => $this->username,
    ];
}

А затем скажите вашей XyzCollection использовать класс:

Настройка базового класса ресурса

Как правило, $this->collection свойство коллекции ресурсов автоматически заполняется результатом сопоставления каждого элемента коллекции с его единственным классом ресурсов. Предполагается, что класс единственного ресурса является именем класса коллекции без завершающего Collection строка.

Например, UserCollection будет пытаться отобразить указанные пользовательские экземпляры в User ресурс. Чтобы настроить это поведение, вы можете переопределить $collects свойство вашей коллекции ресурсов

(Из https://laravel.com/docs/5.7/eloquent-resources)

Если ваша ResourceCollection не делает ничего лишнего, вам может это не всегда понадобиться. Каждый JsonResource может превратиться в коллекцию ресурсов с collection() метод, например UserResource::collection($users)

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