目标:我想从RESTful API中检索下一周所有即将进行的足球比赛。获得这些数据后,我想将结果存储在数据库中。
我要存储的内容:'id', 'homeTeam', 'awayTeam', 'utcDate'
。我想在每次比赛中都这样做,所以'matches'
我的API结果如何:
array:4 [▼
"count" => 10
"filters" => array:1 [▶]
"competition" => array:6 [▶]
"matches" => array:10 [▼
0 => array:12 [▼
"id" => 233107
"season" => array:4 [▶]
"utcDate" => "2018-10-20T11:30:00Z"
"status" => "SCHEDULED"
"matchday" => 9
"stage" => "REGULAR_SEASON"
"group" => "Regular Season"
"lastUpdated" => "2018-10-07T19:02:21Z"
"homeTeam" => array:2 [▼
"id" => 61
"name" => "Chelsea FC"
]
"awayTeam" => array:2 [▼
"id" => 66
"name" => "Manchester United FC"
]
"score" => array:6 [▶]
"referees" => []
]
1 => array:12 [▶]
2 => array:12 [▶]
3 => array:12 [▶]
4 => array:12 [▶]
5 => array:12 [▶]
6 => array:12 [▶]
7 => array:12 [▶]
8 => array:12 [▶]
9 => array:12 [▶]
]
]
我使用Guzzle来执行此API请求:
class GuzzleController extends Controller {
public function getMatches() {
$client = new Client();
$uri = 'http://api.football-data.org/v2/competitions/PL/matches/?matchday=9&season=2018&matches';
$header = ['headers' => ['X-Auth-Token' => 'My-Token']];
$res = $client->get($uri, $header);
$array = json_decode($res->getBody()->getContents(), true);
dd($array);
}
}
我创建了一个模型“匹配”并添加了迁移:
class Match extends Model {
// What code here?
}
迁移:
public function up() {
Schema::create('matches', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->integer('match_id');
$table->string('homeTeam');
$table->string('awayTeam');
});
}
关于如何在比对模型上将这些数据存储到我的数据库的任何提示?
答案 0 :(得分:1)
您可以通过获取所有匹配项数据,然后使用collection遍历每个数据来实现此目的。
可以使用collect()帮助器从数组数据创建集合。
class GuzzleController extends Controller
{
public function getMatches()
{
$client = new Client();
$uri = 'http://api.football-data.org/v2/competitions/PL/matches/?matchday=9&season=2018&matches';
$header = ['headers' => ['X-Auth-Token' => 'My-Token']];
$res = $client->get($uri, $header);
$data = json_decode($res->getBody()->getContents(), true);
return $data['matches'];
}
public function saveMatches()
{
$matches = $this->getMatches();
collect($matches)
->each(function ($match, $key) {
Match::create([
'match_id' => $match['id'],
'homeTeam' => $match['homeTeam']['name'],
'awayTeam' => $match['awayTeam']['name']
]);
});
}
}
使用此代码,我们调用saveMatches()
函数,该函数调用getMatches()
函数(用于运行耗时调用)。
然后,对于每个匹配项,我们使用Match
门面将新记录保存到数据库中。
注释
Team
模型,这样您就可以基于团队来识别和调用比赛。$fillable
模型中调用$guarded
或Match
类变量,以便能够存储数据(see here)。要在作业中使用此功能,首先需要使用
创建作业php artisan make:job <job name>
例如,该作业可以称为CreateMatches
。这将位于app/Jobs/CreateMatches.php
。
您将看到一个handle()
函数,该函数可在作业触发后调用其中的任何功能。
public function handle()
{
$this->saveMatches();
}
public function saveMatches()
{
// Code goes here
}
public function getMatches()
{
// Code goes here
}
然后您可以使用CreateMatches::dispatch()
或使用dispatch(new CreateMatches())
在应用程序逻辑中的任何位置调用作业(不要忘记在文件顶部use
的类)