首页 > 解决方案 > 利用 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 中做到这一点!

提前致谢

史蒂夫

标签: laravellaravel-5.7laravel-resource

解决方案


您首先需要为单个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)


推荐阅读