将 API JSON 响应存储在 SQL 数据库中
Store API JSON response in SQL Database
希望将来自外部 API(使用 Guzzle)的 JSON 响应存储到 mySQL 数据库中。到目前为止我所做的很多事情都是基于这个 question/answer
我有模型、控制器和迁移设置。计划是设置一个每天运行的 CRON 作业,并从 API.
调用新数据
现在,我只想将数据存储到数据库中(我可以稍后设置 CRON 作业)。
我的代码中是否遗漏了什么或有任何错误?我之前设置过路由,但不知道是否适用?
**编辑
当 运行 这样做时,数据库中没有存储任何内容。
型号
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Rating extends Model
{
protected $fillable = ['ratingId', 'ratingName', 'ratingKey', 'ratingKeyName', 'schemeTypeId'];
}
控制器
我这里有两个功能。第一个是消耗外部 API。第二个功能是将其存储到数据库中。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use GuzzleHttp\Client;
use App\Rating;
class GuzzleController extends Controller
{
public function getRatings()
{
$client = new Client([
'url' => 'https://api.ratings.food.gov.uk/ratings'
]);
$request = $client->request('GET', [
'headers' => [
'x-api-version' => '2',
'Accept' => 'application/json'
]
]);
$ratings = json_decode($request->getBody()->getContents(), true);
return $ratings;
}
public function saveRatings()
{
$ratings = $this->getRatings();
collect($ratings)
->each(function($rating, $key) {
Rating::create([
'ratingid' => $rating['ratingid'],
'ratingName' => $rating['ratingName'],
'ratingKey' => $rating['ratingKey'],
'ratingKeyName' => $rating['ratingKeyName'],
'ratingTypeId' => $rating['ratingTypeId']
]);
});
}
}
迁移
这里只是设置table。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateRatingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ratings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('ratingId');
$table->string('ratingName');
$table->string('ratingKey');
$table->string('ratingKeyName');
$table->integer('schemeTypeId');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ratings');
}
}
我发现了你犯的几个小错误。
public function saveRatings()
{
$ratings = $this->getRatings();
collect($ratings)
->each(function($rating, $key) {
Rating::create([
'ratingId' => $rating['ratingId'],
'ratingName' => $rating['ratingName'],
'ratingKey' => $rating['ratingKey'],
'ratingKeyName' => $rating['ratingKeyName'],
'schemeTypeId' => $rating['schemeTypeId']
]);
});
}
'ratingTypeId' => $rating['ratingTypeId']
这是你的函数,但在迁移中你有 $table->integer('schemeTypeId');
你的 Guzzle 请求对我不起作用。这是我的版本。
public function getRatings()
{
$url = 'https://api.ratings.food.gov.uk/ratings';
$client = new Client(['headers' => [
'x-api-version' => '2',
'Accept' => 'application/json'
]]);
$request = $client->request('GET', $url);
$ratings = json_decode($request->getBody()->getContents(), true);
return $ratings['ratings'];
}
希望将来自外部 API(使用 Guzzle)的 JSON 响应存储到 mySQL 数据库中。到目前为止我所做的很多事情都是基于这个 question/answer
我有模型、控制器和迁移设置。计划是设置一个每天运行的 CRON 作业,并从 API.
调用新数据现在,我只想将数据存储到数据库中(我可以稍后设置 CRON 作业)。
我的代码中是否遗漏了什么或有任何错误?我之前设置过路由,但不知道是否适用?
**编辑
当 运行 这样做时,数据库中没有存储任何内容。
型号
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Rating extends Model
{
protected $fillable = ['ratingId', 'ratingName', 'ratingKey', 'ratingKeyName', 'schemeTypeId'];
}
控制器
我这里有两个功能。第一个是消耗外部 API。第二个功能是将其存储到数据库中。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use GuzzleHttp\Client;
use App\Rating;
class GuzzleController extends Controller
{
public function getRatings()
{
$client = new Client([
'url' => 'https://api.ratings.food.gov.uk/ratings'
]);
$request = $client->request('GET', [
'headers' => [
'x-api-version' => '2',
'Accept' => 'application/json'
]
]);
$ratings = json_decode($request->getBody()->getContents(), true);
return $ratings;
}
public function saveRatings()
{
$ratings = $this->getRatings();
collect($ratings)
->each(function($rating, $key) {
Rating::create([
'ratingid' => $rating['ratingid'],
'ratingName' => $rating['ratingName'],
'ratingKey' => $rating['ratingKey'],
'ratingKeyName' => $rating['ratingKeyName'],
'ratingTypeId' => $rating['ratingTypeId']
]);
});
}
}
迁移
这里只是设置table。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateRatingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ratings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('ratingId');
$table->string('ratingName');
$table->string('ratingKey');
$table->string('ratingKeyName');
$table->integer('schemeTypeId');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ratings');
}
}
我发现了你犯的几个小错误。
public function saveRatings()
{
$ratings = $this->getRatings();
collect($ratings)
->each(function($rating, $key) {
Rating::create([
'ratingId' => $rating['ratingId'],
'ratingName' => $rating['ratingName'],
'ratingKey' => $rating['ratingKey'],
'ratingKeyName' => $rating['ratingKeyName'],
'schemeTypeId' => $rating['schemeTypeId']
]);
});
}
'ratingTypeId' => $rating['ratingTypeId']
这是你的函数,但在迁移中你有 $table->integer('schemeTypeId');
你的 Guzzle 请求对我不起作用。这是我的版本。
public function getRatings()
{
$url = 'https://api.ratings.food.gov.uk/ratings';
$client = new Client(['headers' => [
'x-api-version' => '2',
'Accept' => 'application/json'
]]);
$request = $client->request('GET', $url);
$ratings = json_decode($request->getBody()->getContents(), true);
return $ratings['ratings'];
}