使用 Laravel 资源将字段数据格式化为字典
Posted
技术标签:
【中文标题】使用 Laravel 资源将字段数据格式化为字典【英文标题】:Format field data as dictionary using Laravel Resources 【发布时间】:2020-01-31 19:03:18 【问题描述】:我需要格式化 Laravel API 响应的数据字段以使其成为字典。 我正在使用 Laravel 资源。
目前的结果是
"data": [
"id": 1,
"title": "Qui enim rerum."
,
"id": 2,
"title": "Vel praesentium sit."
,
....
],
"links":
"first": "http://localhost:8000/api/articles?page=1",
"last": "http://localhost:8000/api/articles?page=6",
"prev": null,
"next": "http://localhost:8000/api/articles?page=2"
,
"meta":
"current_page": 1,
"from": 1,
"last_page": 6,
"path": "http://localhost:8000/api/articles",
"per_page": 5,
"to": 5,
"total": 30
我对所有的 json 都很好。
但我希望“数据”字段类似于字典:
"data":
"1",
"id": 1,
"title": "Qui enim rerum."
,
"2",
"id": 2,
"title": "Vel praesentium sit."
,
....
这样做,我可以直接访问我想要的项目,而无需遍历数组。 有没有办法使用 Laravel 资源来做到这一点(也许没有,但保留“链接”和“元”)?
谢谢。
【问题讨论】:
【参考方案1】:Laravel API Resources 旨在作为 Eloquent 和 JSON 响应之间的一层。因此它们遵循 Model / Collection 类的“规则”,因为最终范围是让这两个类“开箱即用”的 JSON 表示。
为了实现您的目标,您不应使用 API 资源,但您始终可以为所有集合创建“默认”方式。在我看来,最好的方法是创建一个 trait,这样你就可以在你需要的每个控制器中重用它。像这样的:
trait CustomJsonResponse
function toJsonResponse($collection)
$data = [];
foreach($collection as $model)
$data[$model->id] = $model->toArray
return response()->json([
'data' => $model
'links' => [...],
'meta' => [...]
])
对于链接和元部分,只需查看PaginatedResourceResponse
source code,这样您就可以重用重现相同结果所需的代码部分。
【讨论】:
似乎是最好的解决方案,您能更具体地了解链接和元字段吗? 那么“简单的方法”是从PaginatedResourceResponse
以及paginationInformation
方法中的代码(return ['links' => $this->paginationLinks($paginated), 'meta' => $this->meta($paginated),];
)复制和粘贴paginationLinks
和meta
方法跨度>
【参考方案2】:
您可以根据需要格式化 JSON,方法是在 php 中将其构建为数组并json_encode()
ing 以返回(如果您只返回数据,Laravel 会为您执行此操作)。像这样的东西(警告:未经测试,在浏览器中编码):
$results = Model::all();
$data = [];
foreach($results as $entry)
$data[strval($entry->id)] = [
'id' => $entry->id,
'title' => $entry->title,
'other' => $entry->other
];
return $data; // or explicitly: return json_encode($data);
【讨论】:
以上是关于使用 Laravel 资源将字段数据格式化为字典的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Laravel 资源 API 数据传递给 Vuejs?
如何使用 Freemarker 将 CRM“仅日期”字段格式化为字符串?
jQuery UI Datepicker 将备用字段填充并格式化为 MySQL 日期