使用 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),];)复制和粘贴paginationLinksmeta 方法跨度> 【参考方案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?

Laravel API 资源

如何使用 Freemarker 将 CRM“仅日期”字段格式化为字符串?

jQuery UI Datepicker 将备用字段填充并格式化为 MySQL 日期

如何使用 ISO 8601 格式的 DateTime 字段将 JSON 文本反序列化为 BsonDocument?

Laravel API 资源集合从其他资源返回特定字段