繁体   English   中英

将嵌套的 json 保存到 laravel 的数据库中

[英]Save nested json into database in laravel

我正在通过 laravel 使用带有 Guzzle 的 API 并将响应存储到数据库中。

我已经成功存储了 JSON 响应的“评级”部分。 但现在我想添加“元”-“extractDate”。

我需要改变什么才能让它工作?

下面是我正在使用的 JSON API 响应以及我用来保存到我的数据库中的 controller 的一部分。

使用 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']
                ]);
            });

编辑——附加信息

如果我错了,请纠正我,但目前我认为该集合只能保存“评级”object 的内容。 我试图从收集行中删除 object 并将每一行修改为:

 'ratingId' => $rating['rating']['ratingId'],
 'extractDate' => $rating['meta']['extractDate']

但我得到“未定义的索引:评级”

DD $评级

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 [▶]
]

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

'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']
        ]);
    });

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

问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM