Laravel: Как изменить коллекцию уведомлений

У меня есть функция, которая возвращает уведомления базы данных пользователя (модель пользователя подлежащий регистрации):

return $user->notifications()->get();

Возвращенный результат выглядит так:

[
{
"id": "5d6548d3-1f9b-4da5-b332-afbf428df775",
"type": "Meysam\\Notification\\Classes\\CommentCreated",
"notifiable_id": 1,
"notifiable_type": "RainLab\\User\\Models\\User",
"data": {
"userId": 2,
"commentId": 18
},
"read_at": null,
"created_at": "2018-03-05 09:58:34",
"updated_at": "2018-03-05 09:58:34"},
{
"id": "2e22e24e-a972-4a30-afeb-0049a40966a7",
"type": "Meysam\\Notification\\Classes\\CommentCreated",
"notifiable_id": 1,
"notifiable_type": "RainLab\\User\\Models\\User",
"data": {
"userId": 3,
"commentId": 17
},
"read_at": null,
"created_at": "2018-03-05 09:38:38",
"updated_at": "2018-03-05 09:38:38"}
]

Какой лучший способ изменить эту коллекцию перед ее возвратом? Например, я хочу удалить "id" поле из объектов, изменить значение "type" поле для "CommentCreated"и добавьте новые поля, такие как "url", "username", "email", etc к каждому предмету. Это хорошая идея, чтобы добавить hidden, visible а также append атрибуты в DatabaseNotification модель класса (если да, то как)? Являются Ресурсы API полезно здесь?

3

Решение

Для Laravel 5.5+

использование Ресурсы API.

Для Laravel < 5,5

Как предлагает @linktoahref, хорошая идея — использовать фракталы.

По определению REF: http://fractal.thephpleague.com/

Fractal предоставляет слой представления и преобразования для сложных
вывод данных, подобный тому, который есть в RESTful API, и работает очень хорошо
с JSON. Думайте об этом как о слое представления для вашего JSON / YAML / и т.д.

Вы можете использовать фракталы для преобразования данных в соответствующий формат. При работе с laravel рекомендуется создавать фракталы для каждой модели и использовать их по мере необходимости. Он может принять модель и выполнить преобразование для каждого поля и вернуться в надлежащий формат данных.

spatie/laravel-fractal хороший пакет для начала работы с фракталами.

1

Другие решения

Если вы хотите просто изменить возвращаемое значение коллекции, то это можно сделать следующим образом:

$user->notifications()->get()->map(function($item) {
unset($item['id']); //remove id
$item['type'] = "CommentCreated"; //change the value of "type" field
$item['url'] = "url content"; //add new data
$item['username'] = "username content"; //add new data
$item['email'] = "email content"; //add new data
return $item;
});
1

По вопросам рекламы [email protected]