【问题标题】:Save nested json into database in laravel在 laravel 中将嵌套的 json 保存到数据库中
【发布时间】: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 循环而不是收集。

标签: php json laravel guzzle


【解决方案1】:

您没有任何这样的数据结构:

'ratingId' => $rating['rating']['ratingId']

你没有“评分”的键。

你有

'ratingId' => $ratings['ratings'][$idx]['rating_id']

我想你想要的是这样的:

collect($ratings['ratings'])
    ->each(function($rating, $key) use ($ratings) {
        Rating::updateOrCreate([
            'ratingId' => $rating['ratingId'],
            'ratingName' => $rating['ratingName'],
            'ratingKey' => $rating['ratingKey'],
            'ratingKeyName' => $rating['ratingKeyName'],
            'schemeTypeId' => $rating['schemeTypeId'],
            'extractDate' => $ratings['meta']['extractDate']
        ]);
    });

我原来的评论是基于你的问题:)

【讨论】:

  • 对不起,库尔特,我没有关注。使用我现有的设置,我能够成功地将所有内容保存到我的数据库中。只是我无法开始工作的 ["meta"]["extractDate"]。我尝试在您的第一条评论中修改结构,但当我尝试以下操作时,我最终得到“未定义的索引:评级”:'ratingId' => $rating['rating']['ratingId']
  • 您的问题与元无关,错误消息告诉您它与“评级”有关
  • 但我得到'未定义的索引:评级'
  • 我想我已经解决了你的问题,但在这种情况下,我认为 foreach 比你的收集方法要好得多,所以你不需要在收视率范围内。
  • 我今天要签收。我希望我发布的最终解决方案对你有用:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2016-11-21
  • 2020-12-18
  • 2018-03-24
  • 2020-02-21
  • 1970-01-01
相关资源
最近更新 更多