Laravel eloquent api 资源删除 `data` 键(无收集)

Posted

技术标签:

【中文标题】Laravel eloquent api 资源删除 `data` 键(无收集)【英文标题】:Laravel eloquent api resource remove `data` key (no collection) 【发布时间】:2020-07-04 21:25:43 【问题描述】:

我有 user 的自定义 eloquent api 资源。例如当我使用这个资源时

代码

$user = $request->user();
return new UserResource($user);

然后我得到回应:


    "data": 
        "name": "Margarete Daniel",
        "email": "goldner.berniece@example.net",
        "verified": "2020-03-20T07:15:56.000000Z"
    

如何更改 api 资源并获得示例响应:


    "name": "Margarete Daniel",
    "email": "goldner.berniece@example.net",
    "verified": "2020-03-20T07:15:56.000000Z"

【问题讨论】:

【参考方案1】:

将此添加到您的资源中

public static $wrap = null;

【讨论】:

这应该是公认的答案 - 这会禁用每个资源而不是整个应用程序的数据包装【参考方案2】:

您可以通过在AppServiceProvider 中调用资源的withoutWrapping 静态方法来禁用数据包装。在您的情况下,它将是:

public function boot()

    UserResource::withoutWrapping();

更多解释可以参考Laravel documentation about data wrapping。

【讨论】:

【参考方案3】:

在我自己不断遇到同样的问题时回答。

在没有 data 包装的情况下返回 Laravel 资源的最简单方法是在 JSON 响应中简单地返回它。所以不要这样做:

return new UserResource($user);

你会这样做:

return response()->json(new UserResource($user));

这样,您也不必担心大量调用 withoutWrapping 方法来填充您的 AppServiceProvider

【讨论】:

为什么返回 JsonResponse 会删除包装?有文档链接吗? @rock3t 如果您手动将资源转换为 JsonResponse(如上面的示例),则 JsonResponse 假定资源中始终存在 $data 属性并像 $resource->data 一样使用它。这就是为什么只有在资源自己翻译成响应时才会发生解包。即return new UserResource($user);【参考方案4】:

要删除项目中所有资源的数据包装器,只需添加:

use Illuminate\Http\Resources\Json\JsonResource    

public function boot()

    JsonResource::withoutWrapping();

AppServiceProvider.phpboot 方法内。

【讨论】:

【参考方案5】:

这对我有用

return UserResource::make($user)->toArray($request);

用于收藏

return UserResource::collection($users)->collection;

【讨论】:

以上是关于Laravel eloquent api 资源删除 `data` 键(无收集)的主要内容,如果未能解决你的问题,请参考以下文章

具有 Relation 和 Eloquent 的 Laravel Api 资源

向 eloquent 资源添加过滤器以有条件地附加关系

Laravel:在 API 测试中使用 Eloquent 模型

Eloquent - 如果外键有行,则防止删除数据 - Laravel

Laravel Eloquent 的 API 适配器?

Laravel Eloquent 级联删除