Провожу онлайн-матчи по игре Dota 2 на сайте. Пользуюсь сторонним сервисом для разбора. Все работает как задумано, только есть 1 проблема. У меня 2 модели Tournament
и Tournament_teams
. Вот проблема: при парсинге данные в Tournament
дублируются 3-4 раза, скриншот:
Показывает, что где-то данные дублируется 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, остальные с пустыми значениями. Это основная проблема и моя головная боль. Вот скриншот из базы данных:
Вот мой код, который производит парсинг:
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% команд эти данные есть, у остальных нет.
Надеюсь на вашу помощь. Если нужны пояснения - спрашивайте, отвечу на вопросы. Буду рад если будет ошибка и исправят