【发布时间】:2020-10-20 03:14:04
【问题描述】:
我正在通过 laravel 使用 Guzzle 的 API 并将响应存储到数据库中。
我已成功存储 JSON 响应的“评分”部分。但现在我想添加“meta”-“extractDate”。
我需要进行哪些更改才能使其正常工作?
以下是我正在使用的 JSON API 响应以及我用来保存到我的数据库中的控制器的一部分。
使用 laravel 7.0
**JSON from API**
{
"ratings": [
{
"ratingId": 12,
"ratingName": "5",
"ratingKey": "fhrs_5_en-gb",
"ratingKeyName": "5",
"schemeTypeId": 1,
"links": [
{
"rel": "self",
"href": "http://api.ratings.food.gov.uk/ratings/12"
}
]
}
],
"meta": {
"dataSource": "API",
"extractDate": "2020-06-29T21:24:43.820107+01:00",
"itemCount": 11,
"returncode": "OK",
"totalCount": 11,
"totalPages": 1,
"pageSize": 11,
"pageNumber": 1
}
}
**controller snippet**
$client = $this->client();
$request = $client->request('GET', 'https://api.ratings.food.gov.uk/ratings');
$ratings = json_decode($request->getBody()->getContents(), true);
collect($ratings['ratings'])
->each(function($rating, $key) {
Rating::updateOrCreate([
'ratingId' => $rating['ratingId'],
'ratingName' => $rating['ratingName'],
'ratingKey' => $rating['ratingKey'],
'ratingKeyName' => $rating['ratingKeyName'],
'schemeTypeId' => $rating['schemeTypeId'],
'extractDate' => $rating['extractDate']
]);
});
编辑 -- 附加信息
如果我错了,请纠正我,但目前我认为该集合只能保存“评级”对象的内容。我试图从收集行中删除对象并将每一行修改为:
'ratingId' => $rating['rating']['ratingId'],
'extractDate' => $rating['meta']['extractDate']
但我得到'未定义的索引:评级'
DD 的 $ratings
array:3 [▼
"ratings" => array:11 [▼
0 => array:6 [▼
"ratingId" => 12
"ratingName" => "5"
"ratingKey" => "fhrs_5_en-gb"
"ratingKeyName" => "5"
"schemeTypeId" => 1
"links" => array:1 [▶]
]
1 => array:6 [▶]
2 => array:6 [▶]
3 => array:6 [▶]
4 => array:6 [▶]
5 => array:6 [▶]
6 => array:6 [▶]
7 => array:6 [▶]
8 => array:6 [▶]
9 => array:6 [▶]
10 => array:6 [▶]
]
"meta" => array:8 [▼
"dataSource" => "API"
"extractDate" => "2020-06-29T22:56:04.250649+01:00"
"itemCount" => 11
"returncode" => "OK"
"totalCount" => 11
"totalPages" => 1
"pageSize" => 11
"pageNumber" => 1
]
"links" => array:1 [▶]
]
【问题讨论】:
-
您需要发布更多信息。具体是什么不起作用?错误消息、支持信息、您尝试过的事情。
-
更新@KurtFriars
-
你是如何填充这个 $ratings 变量的?
-
$ratings = json_decode($request->getBody()->getContents(), true);
-
你可以 dd($ratings),如果我的预感是正确的,也可以尝试使用 foreach 循环而不是收集。