Как обновить столбец в таблице, если результаты API были изменены - PullRequest
0 голосов
/ 29 октября 2018

Мое приложение: Мое приложение позволяет пользователям прогнозировать результаты всех предстоящих футбольных матчей на следующий игровой день. Я получаю эти данные из API и сохраняю предстоящие игры в своей базе данных. Эти предстоящие игры имеют status из Scheduled. Теперь я хочу запускать cronjob каждые несколько минут, который проверяет, был ли статус этих совпадений изменен на in_play или finished, если это так, я хочу обновить 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 job (эта работа получает данные 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 голосов
/ 29 октября 2018

Вероятно, вы захотите использовать метод updateOrCreate () Laravel для вашего объекта Match. Уникально идентифицирующая информация представляется идентификатором совпадения. Если это никогда не изменится, тогда, когда вы просматриваете каждое ваше утверждение, вы можете сделать это:

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

То, что это делает, ищет существующее совпадение с тем же идентификатором. Если он уже существует, он просто обновит его всей информацией, предоставленной API, включая статус матча и оценки. Если он еще не существует, он вместо этого создаст его и сохранит в базе данных как новое совпадение со всей предоставленной информацией. Надеюсь, это поможет!

...