如果api结果已修改,如何更新表中的列

时间:2018-10-29 15:06:54

标签: php laravel laravel-jobs

我的应用程序:我的应用程序允许用户预测下一个比赛日所有即将进行的足球比赛的得分。我从API获取此数据,并将即将发布的游戏存储在数据库中。这些即将推出的游戏的status中的Scheduled。现在,我想每隔几分钟运行一次cronjob,以检查那些匹配项的状态是否已更改为in_playfinished,如果是这种情况,我想在其中更新我的status field我的数据库与api中的状态字段正确匹配。

如何检查状态是否已更改并修改数据库中的正确匹配项?我存储了一个match_id可以用于此目的吗?

我的代码: updateStatus个工作

public function handle()
    {
        $this->updateStatus();
    }

    public function updateStatus() {

        $this->getMatches();

        // check if status has been changed from schedulded to 'in_play' or 'finished'
        // update the match status of the right matches in my database
    }

    public function getMatches() {

        $client = new Client();
        $uri = 'http://api.football-data.org/v2/competitions/PL/matches/?matchday=12&season=2018&matches';
        $header = ['headers' => ['X-Auth-Token' => 'My-token']];
        $res = $client->get($uri, $header);
        return json_decode($res->getBody()->getContents(), true);

    }

getMatches作业(此作业获取api数据并将其存储在数据库中)

 public function handle()
    {
        $this->saveMatches();
    }

    public function saveMatches()
    {
        $matches = $this->getMatches();

        collect($matches['matches'])
            ->each(function ($match, $key) {
                $date = new DateTime($match['utcDate']);
                Match::create([
                    'match_id' => $match['id'],
                    'homeTeam' => $match['homeTeam']['name'],
                    'awayTeam' => $match['awayTeam']['name'],
                    'status'   => $match['status'],
                    'date'     => $date->format('Y-m-d'),
                    'time'     => $date->format('H:i'),
                    'matchday' => $match['matchday'],
                    'homeScore'=> $match['score']['fullTime']['homeTeam'],
                    'awayScore'=> $match['score']['fullTime']['awayTeam']
                ]);
            });


    }
    public function getMatches()
    {
        $client = new Client();
        $uri = 'http://api.football-data.org/v2/competitions/PL/matches/?matchday=12&season=2018&matches';
        $header = ['headers' => ['X-Auth-Token' => 'My-token']];
        $res = $client->get($uri, $header);
        return json_decode($res->getBody()->getContents(), true);
    }

1 个答案:

答案 0 :(得分:1)

您可能想做的是在Match对象上利用Laravel的updateOrCreate()方法。唯一标识信息似乎是匹配ID。如果这从未改变,那么当您遍历每个语句时,您可以执行以下操作:

Match::updateOrCreate([
        'id' => $match['id'],
    ],[
        'homeTeam' => $match['homeTeam']['name'],
        'awayTeam' => $match['awayTeam']['name'],
        'status'   => $match['status'],
        'date'     => $date->format('Y-m-d'),
        'time'     => $date->format('H:i'),
        'matchday' => $match['matchday'],
        'homeScore'=> $match['score']['fullTime']['homeTeam'],
        'awayScore'=> $match['score']['fullTime']['awayTeam']
    ]);

这是寻找具有相同ID的现有匹配项。如果已经存在,它将使用API​​提供的所有信息(包括比赛状态和得分)简单地对其进行更新。如果尚不存在,它将创建它并将其作为与所有提供的信息的新匹配存储在数据库中。希望这会有所帮助!