GameEnterDailyStat.php 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Database\QueryException;
  5. use Illuminate\Support\Facades\DB;
  6. class GameEnterDailyStat extends Model
  7. {
  8. const TABLE = 'agent.dbo.game_enter_daily_stat';
  9. protected $table = self::TABLE;
  10. public $timestamps = false;
  11. /**
  12. * Increment daily aggregate for game enter duration.
  13. */
  14. public static function incrementStat(int $gameId, string $logDate, int $durationMs): void
  15. {
  16. $now = date('Y-m-d H:i:s');
  17. $updated = DB::connection('write')->table(self::TABLE)
  18. ->where('game_id', $gameId)
  19. ->where('log_date', $logDate)
  20. ->update([
  21. 'enter_count' => DB::raw('enter_count + 1'),
  22. 'total_duration_ms' => DB::raw('total_duration_ms + ' . (int) $durationMs),
  23. 'updated_at' => $now,
  24. ]);
  25. if ($updated > 0) {
  26. return;
  27. }
  28. try {
  29. DB::connection('write')->table(self::TABLE)->insert([
  30. 'game_id' => $gameId,
  31. 'log_date' => $logDate,
  32. 'enter_count' => 1,
  33. 'total_duration_ms' => $durationMs,
  34. 'updated_at' => $now,
  35. ]);
  36. } catch (QueryException $e) {
  37. if (stripos($e->getMessage(), 'duplicate key') === false
  38. && stripos($e->getMessage(), 'unique') === false) {
  39. throw $e;
  40. }
  41. DB::connection('write')->table(self::TABLE)
  42. ->where('game_id', $gameId)
  43. ->where('log_date', $logDate)
  44. ->update([
  45. 'enter_count' => DB::raw('enter_count + 1'),
  46. 'total_duration_ms' => DB::raw('total_duration_ms + ' . (int) $durationMs),
  47. 'updated_at' => $now,
  48. ]);
  49. }
  50. }
  51. }