Laravel сбросил некоторые значения при разборе - PullRequest
0 голосов
/ 07 мая 2020

Я анализирую совпадения для DotA 2. Через сторонний API я получаю текущие, будущие и прошлые совпадения. Но проблема, насколько я понимаю, это функция updateOrCreate не работает. При запуске синтаксического анализа он сохраняет значения, но не обновляет текущие. Вот пример ответа, который я получаю https://pastebin.com/KCcG6rJc, в этом ответе указано, какие команды играют сейчас, есть match_id команд, если команды соревнуются друг с другом, это значение та же. Используя пример этого результата синтаксического анализа, я получил следующую запись в базе данных:

maches table, получилось значение match_id - 560004, верно. Но в teams table, где указаны эти команды, match_id имеет значение null.

В моем парсере у меня есть этот код:

foreach($tournaments as $tournament)
        {
            $teams = $tournament->teams;
            $league_name = $tournament->league->name;
            $serie_name = $tournament->serie->name;
            if ($serie_name === null) {
                $full_name = $league_name;
            } else {
                $full_name = $league_name.": $serie_name";
            }
            $filtered_matches = [];
            foreach ($matches as $match) {
                if ($match->tournament_id != $tournament->id) {
                    continue;
                }
                $filtered_matches[] = $match;
                foreach ($teams as &$team) {
                    if (false !== strpos($match->slug, $team->slug)) {
                        $team->match_id = $match->id;
                        $logo = $team->image_url;
                    }
                }
            }
            foreach ($live_matches as $live) {
                if ($live->tournament_id != $tournament->id) {
                    continue;
                }
                $filtered_matches[] = $live;
                foreach ($teams as &$team) {
                    if (false !== strpos($live->slug, $team->slug)) {
                        $team->match_id = $live->id;
                        $logo = $team->image_url;
                    }
                }
            }
            foreach ($finish_matches as $finish) {
                if ($finish->tournament_id != $tournament->id) {
                    continue;
                }
                $filtered_matches[] = $finish;
                foreach ($teams as &$team) {
                    if (false !== strpos($finish->slug, $team->slug)) {
                        $team->match_id = $finish->id;
                        $logo = $team->image_url;
                    }
                }
            }
            $this->tournamentRepository->saveUpdate($tournament->id, $teams, $full_name, $filtered_matches);
        }

var_dump($team); exit; скажите мне:

object(stdClass)#1222 (8) {
  ["acronym"]=>
  string(8) "ThunderP"
  ["id"]=>
  int(2671)
  ["image_url"]=>
  string(93) "https://cdn.pandascore.co/images/team/image/2671/87033C79D6D1A70A66941BC8649EA5988D74582C.png"
  ["location"]=>
  string(2) "PE"
  ["modified_at"]=>
  string(20) "2020-04-30T01:51:51Z"
  ["name"]=>
  string(16) "Thunder Predator"
  ["slug"]=>
  string(16) "thunder-predator"
  ["match_id"]=>
  int(560004)
}

т.е. я получаю match_id, но в базе данных он не добавляется.

И вот моя полная функция, которая обновляет или создает:

public function saveUpdate(int $tournament_id, array $tournament_teams, string $full_name, array $matches)
{
    $tournament = Tournament::updateOrCreate([
        'tournament_id' => $tournament_id,
        'league_name'   => $full_name
    ]);

    foreach ($matches as $match) {
        if ($match->status == 'not_started') {
            $status = 0;
        }
        if ($match->status == 'running') {
            $status = 1;
        }
        if ($match->status == 'finished') {
            $status = 2;
        }
        $team = Tournament_teams::where('team_id', $match->winner_id)->first();

        Tournament_matches::updateOrCreate([
            'name'       => $match->name,
            'started_at' => Carbon::parse("$match->begin_at,")->setTimezone('Europe/Berlin'),
            'ended_at'   => $match->end_at,
            'winner_id'  => $team->id ?? null,
            'status'     => $status,
            'match_id'   => $match->id,
            'live'       => $match->live_url,
        ]);
    }

    foreach ($tournament_teams as $team) {
        Tournament_teams::updateOrCreate([
            'tournaments_id' => $tournament->id,
            'team'           => $team->name,
            'slug'           => $team->slug,
            'logo'           => $team->image_url,
            'team_id'        => $team->id,
            'match_id'       => $team->match_id ?? null,
        ]);
    }
}

Например, если Я удаляю 1 значение столбца из таблицы teams и начинаю синтаксический анализ, тогда значение в этом столбце не будет создано. То есть создает данные, но не обновляет.

А теперь играют команды с match_id 560334 а в таблице tournament_teams нет такого match_id, искал играющие команды по названию и обнаружил, что в базе 3 раза подряд присутствует 1 играющая команда. То есть в одной записи match_id = null, у других тех же команд match_id старые. По какой-то причине данные по текущему не обновляются и в базу поступают пустые значения, хотя 50% значений обновляются. Вот скриншот с выделенными командами, для которых, например, данные не обновляются: Screenshot

Где могла быть моя ошибка? Почему var_dump передает мне match_id, но это значение не попадает в базу данных? Где могла быть моя ошибка? Если нужно уточнить какие-то детали - спрашивайте, спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...