4

我有一个返回用户数据库通知的函数(用户模型是Notifiable):

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是一个好主意(如果是,如何)?API 资源在这里有用吗?hiddenvisibleappend DatabaseNotification

4

2 回答 2

2

如果您只想更改集合的返回值,则可以这样完成:

$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;
});
于 2018-03-05T14:50:05.563 回答
1

对于 Laravel 5.5+

使用API 资源

对于 Laravel < 5.5

正如@linktoahref 所建议的那样,使用分形是个好主意。

根据定义,REF: http: //fractal.thephpleague.com/

Fractal 为复杂的数据输出提供了一个表示和转换层,就像在 RESTful API 中找到的一样,并且与 JSON 配合得非常好。将此视为您的 JSON/YAML/等的视图层。

您可以使用分形将数据转换为适当的格式,在使用 laravel 时,最好为每个模型创建分形并在需要时使用。它可以接受模型并对每个字段执行转换并以适当的数据格式返回。

spatie/laravel-fractal是一个很好的分形入门包。

于 2018-03-05T13:46:44.253 回答