0

我需要格式化 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 Resource 来做到这一点(也许没有,但保留“链接”和“元”)?

谢谢。

4

2 回答 2

1

Laravel API 资源旨在作为 Eloquent 和 JSON 响应之间的一层。因此它们遵循 Model / Collection 类的“规则”,因为最终范围是拥有这两个类的“开箱即用”的 JSON 表示。

为了实现您的目标,您不应使用 API 资源,但您始终可以为所有集合创建“默认”方式。在我看来,最好的方法是创建一个特征,这样你就可以在你需要的每个控制器中重用它。像这样的东西:

trait CustomJsonResponse
{

  function toJsonResponse($collection)
  {
    $data = [];

    foreach($collection as $model) {
      $data[$model->id] = $model->toArray
    }

    return response()->json([
      'data' => $model
      'links' => [...],
      'meta' => [...]
    ])
  }
}

对于链接和元部分,只需查看PaginatedResourceResponse源代码,以便您可以重用重现相同结果所需的代码部分。

于 2019-10-02T13:38:52.337 回答
0

您可以根据需要格式化 JSON,方法是在 PHP 中将其构建为数组并将json_encode()其用于返回(如果您仅返回数据,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);
于 2019-10-02T13:39:16.253 回答