Laravel не дает 1 значение при разборе - PullRequest
0 голосов
/ 26 мая 2020

Провожу онлайн-матчи по игре Dota 2 на сайте. Пользуюсь сторонним сервисом для разбора. Все работает как задумано, только есть 1 проблема. У меня 2 модели Tournament и Tournament_teams. Вот проблема: при парсинге данные в Tournament дублируются 3-4 раза, скриншот:

enter image description here

Показывает, что где-то данные дублируется 3 раза, где-то данные дублируются 4 раза, непонятно по какой причине.

А проблема в Tournament_teams, сейчас сделал парсинг и получил ответ, что сейчас играют 2 команды с именами ViKin.gg и CR4ZY, которые имеют match_id = 561715. Команда ViKin.gg в базе имеет match_id 561715, а у их соперников CR4ZY пустые значения. Если вы выполните поиск по CR4ZY, то я получу 5 записей с пустым match_id, ViKin.gg имеет 2 записи с заполненным match_id, остальные с пустыми значениями. Это основная проблема и моя головная боль. Вот скриншот из базы данных:

enter image description here

Вот мой код, который производит парсинг:

public function execute()
    {
        $postFields = ['token' => $this->key];
        $tournaments = $this->sendCurl($postFields, $this->url);
        $postFields_matches = ['token' => $this->key];
        $matches = $this->sendCurl($postFields_matches, $this->matches);
        $postFields_live_matches = ['token' => $this->key];
        $live_matches = $this->sendCurl($postFields_live_matches, $this->live_matches);
        $postFields_finish_matches = ['token' => $this->key];
        $finish_matches = $this->sendCurl($postFields_finish_matches, $this->finish_matches);
        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);
        }
    }

А вот код, который сохранить в базе данных:

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) {
        $exist_team = Tournament_teams::where('external_tournament_id', $tournament_id)->where('team_id', $team->id)->first();
        $is_exist_team = Tournament_teams::where('external_tournament_id', $tournament_id)->where('team_id', $team->id)->count();
        if ($is_exist_team == 0) {
            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,
                'external_tournament_id' => $tournament_id,
            ]);
        } else {
            $exist_team->match_id = $team->match_id ?? null;
            $exist_team->save();
        }
    }
}

Вот уже 4 дня я не могу понять, почему данные в Tournaments дублируются 3 раза, а данные в поле match_id не принимаются в Tournaments_teams . В модели это поле указано, потому что у 50% команд эти данные есть, у остальных нет.

Надеюсь на вашу помощь. Если нужны пояснения - спрашивайте, отвечу на вопросы. Буду рад если будет ошибка и исправят

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