Я анализирую совпадения для 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% значений обновляются. Вот скриншот с выделенными командами, для которых, например, данные не обновляются:
Где могла быть моя ошибка? Почему var_dump
передает мне match_id
, но это значение не попадает в базу данных? Где могла быть моя ошибка? Если нужно уточнить какие-то детали - спрашивайте, спасибо за помощь.