изменение имен ключей при использовании ресурсов 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!

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

Стив


person Citti    schedule 04.11.2018    source источник
comment
Ваша коллекция основана на модели? Если да, вы можете попробовать расширить модель до новой модели, которая используется только API. Затем вы можете создать добавленные атрибуты с желаемыми именами и скрыть исходные имена атрибутов с помощью массива $ hidden в модели. Это немного более элегантно, чем использование сопоставления или циклов для программного переименования вещей.   -  person eResourcesInc    schedule 04.11.2018


Ответы (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#concept-overview)

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

person Travis Britz    schedule 05.11.2018
comment
просто получил возможность взглянуть на это - с первого взгляда на то, что вы опубликовали из документации, я думаю, что это могло попасть в самую точку - не знаю, как я пропустил переопределение $ Collects - сообщу, когда я копаюсь в это! - person Citti; 05.11.2018
comment
тьфу я знаю как я пропустил оверрайд! просто вернулся на страницу с моей документацией, и это было на v5.5! должно быть это та версия, которую я получил через поиск в Google! FUNNNNNN !!!!!! - person Citti; 05.11.2018
comment
Ладно все - так ясно, что версия 5.7 документации намного лучше излагает :) МОЯ ОШИБКА. Так что часть головоломки, которую мне не хватало, заключалась в следующем: ›Коллекция ресурсов автоматически заполняется в результате сопоставления каждого элемента коллекции с его единственным классом ресурсов после того, как я изменил имя, чтобы он действительно правильно подобрал его - Теперь он поднимается мои коллекции именно так, как я хочу их отображать! Спасибо @Travis - person Citti; 05.11.2018