Я работаю над проектом Laravel, в котором мне нужно отображать статистику игроков за разные периоды (последний день, прошлую неделю, последний месяц и в целом). Статистика хранится в модели PlayerShip, и мне нужно получить статистику на основе периодов.
У меня есть таблицы, которые показывают статистику для каждого отдельного игрока, по сути, это одно и то же 10- 12 статистических данных за каждый период, но статистика различается в зависимости от периода, когда она была рассчитана, и, конечно, она всегда будет меняться.
Итак, подводя итог, мое приложение должно отображать статистику, которую имел игрок. : прошлая неделя, прошлый месяц, прошлый день и в целом.
Код настроен так: у меня были миграции, которые формировали структуру базы данных для таблицы, где эти данные хранятся и откуда они извлекаются, есть "updated_at" поле, которое представляет собой временную метку, которая обновляется каждый раз, когда запускается метод из кода службы. Я попробовал это использовать, но быстро понял, что такая вещь не может получить одну и ту же статистику, но за разные периоды, потому что существует задание cron, которое запускает этот сервисный код каждый день и также обновляет статистику.
В этой таблице базы данных много столбцов, но каждый из них, кроме идентификатора учетной записи и имени игрока, представляет собой вычисляемую статистику. Мне нужно знать, можно ли как-то сохранить статистику в том виде, в котором она была на другую дату, а затем продемонстрировать ее так, как будто она была в последний день, как на прошлой неделе... и т. д.
У меня уже есть метод, который извлекает данные из API Wargaming и рассчитывает статистику в нужном мне формате. Итак, с этой частью разобрались, и все окей, я просто удалил ее из поста, потому что она слишком длинная. Мне просто нужно найти способ получать статистику между периодами.
Вот мой сервисный код, так как я считаю, что это единственный код, который вам нужен. Контроллер только пересылает это на вид. Методы, которые меня беспокоят, находятся во фрагменте кода, в файле больше кода, но я сократил его, чтобы не беспокоить вас, ребята. Я новичок в «более серьезном» мире программирования, поэтому любые ответы приветствуются.
Кроме того, я вставлю схему таблицы базы данных.
Схема таблицы
('id', 'bigint(20) unsigned'),
('ship_id', 'bigint(20) unsigned'),
('battles_played', 'int(11)'),
('wins_count', 'int(11)'),
('damage_dealt', 'bigint(20)'),
('average_damage', 'bigint(20)'),
('frags', 'int(11)'),
('xp', 'int(11)'),
('survival_rate', 'double'),
('created_at', 'timestamp'),
('updated_at', 'timestamp'),
('account_id', 'bigint(20) unsigned'),
('player_name', 'varchar(255)'),
('distance', 'int(11)'),
('pve_battles', 'int(11)'),
('pve_wins', 'int(11)'),
('pve_frags', 'int(11)'),
('pve_xp', 'int(11)'),
('pve_survived_battles', 'int(11)'),
('pvp_battles', 'int(11)'),
('pvp_wins', 'int(11)'),
('pvp_frags', 'int(11)'),
('pvp_xp', 'int(11)'),
('pvp_survived_battles', 'int(11)'),
('club_frags', 'int(11)'),
('club_xp', 'int(11)'),
('club_battles', 'int(11)'),
('club_wins', 'int(11)'),
('club_survived_battles', 'int(11)'),
('rank_battles', 'int(11)'),
('rank_wins', 'int(11)'),
('rank_frags', 'int(11)'),
('rank_xp', 'int(11)'),
('rank_survived_battles', 'int(11)'),
('wn8', 'int(11)'),
('ship_name', 'varchar(255)'),
('ship_type', 'varchar(255)'),
('ship_tier', 'int(11)'),
('ship_nation', 'varchar(255)'),
('total_player_wins', 'int(11)'),
('last_battle_time', 'int(10) unsigned'),
('capture', 'int(11)'),
('defense', 'int(11)'),
('spotted', 'int(11)')
Сервисный код
public function getTopPlayersLast24Hours()
{
$last24Hours = now()->subDays(1);
return PlayerShip::select('account_id', DB::raw('MAX(player_name) as player_name'), DB::raw('MAX(total_player_wn8) as total_player_wn8'))
->where('ship_tier', '>', 5)
->where('battles_played', '>', 5)
->where('updated_at', '', 5)
->where('battles_played', '>', 30)
->where('updated_at', '', 5)
->where('battles_played', '>', 120)
->where('updated_at', '>=', $lastMonth)
->groupBy('account_id')
->orderByDesc('total_player_wn8')
->limit(10)
->get()
->map(function ($player) {
return [
'name' => $player->player_name,
'wid' => $player->account_id,
'wn8' => $player->total_player_wn8,
];
})
->toArray();
}
public function getTopPlayersOverall()
{
$overall = now()->subDays(29);
return PlayerShip::select('account_id', DB::raw('MAX(player_name) as player_name'), DB::raw('MAX(total_player_wn8) as total_player_wn8'))
->where('ship_tier', '>', 5)
->where('battles_played', '>', 500)
->where('updated_at', '>=', $overall)
->groupBy('account_id')
->orderByDesc('total_player_wn8')
->limit(10)
->get()
->map(function ($player) {
return [
'name' => $player->player_name,
'wid' => $player->account_id,
'wn8' => $player->total_player_wn8,
];
})
->toArray();
}
//get stats for each player, based on a period: 24, 7, 30, overall
public function getPlayerStatsLastDay($account_id)
{
$playerStatistics = PlayerShip::select(
'battles_played as battles',
'wins_count as wins',
'ship_tier as tier',
'survival_rate as survived',
'damage_dealt as damage',
'frags as frags',
'xp as xp',
'spotted as spotted',
'capture as capture',
'defend as defend',
'wn8 as wn8'
)
->where('account_id', $account_id)
->where('updated_at', '>=', now()->subDay())
->first();
Log::info($playerStatistics);
return $playerStatistics ? $playerStatistics->toArray() : [];
}
public function getPlayerStatsLastWeek($account_id)
{
$playerStatistics = PlayerShip::select(
'battles_played as battles',
'wins_count as wins',
'ship_tier as tier',
'survival_rate as survived',
'damage_dealt as damage',
'frags as frags',
'xp as xp',
'spotted as spotted',
'capture as capture',
'defend as defend',
'wn8 as wn8'
)
->where('account_id', $account_id)
->where('updated_at', '>=', now()->subWeek())
->first();
Log::info($playerStatistics);
return $playerStatistics ? $playerStatistics->toArray() : [];
}
public function getPlayerStatsLastMonth($account_id)
{
$playerStatistics = PlayerShip::select(
'battles_played as battles',
'wins_count as wins',
'ship_tier as tier',
'survival_rate as survived',
'damage_dealt as damage',
'frags as frags',
'xp as xp',
'spotted as spotted',
'capture as capture',
'defend as defend',
'wn8 as wn8'
)
->where('account_id', $account_id)
->where('updated_at', '>=', now()->subMonth())
->first();
Log::info($playerStatistics);
return $playerStatistics ? $playerStatistics->toArray() : [];
}
public function getPlayerStatsOverall($account_id)
{
$playerStatistics = PlayerShip::select(
'battles_played as battles',
'wins_count as wins',
'ship_tier as tier',
'survival_rate as survived',
'damage_dealt as damage',
'frags as frags',
'xp as xp',
'spotted as spotted',
'capture as capture',
'defend as defend',
'wn8 as wn8'
)
->where('account_id', $account_id)
->first();
Log::info($playerStatistics);
return $playerStatistics ? $playerStatistics->toArray() : [];
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-last-mon
Отслеживайте статистические периоды (отображение статистики в приложении за последние 7 дней, последний месяц и т. д.) ⇐ MySql
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение