Visit.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Facades\Cache;
  6. use Illuminate\Http\Request;
  7. class Visit extends Model
  8. {
  9. protected $table = 'visits';
  10. protected $primaryKey = 'id';
  11. public $keyType = 'int';
  12. public $incrementing = true;
  13. public $timestamps = true;
  14. const CREATED_AT = 'created_at';
  15. const UPDATED_AT = null;
  16. const DELETED_AT = null;
  17. protected $guarded = [];
  18. /**
  19. * 방문자 수 등록
  20. */
  21. public function register(Request $request): ?\Shetabit\Visitor\Models\Visit
  22. {
  23. return visitor()->visit($request->user());
  24. }
  25. /**
  26. * 월간 방문자 수
  27. */
  28. public function getMonthlyData(): array
  29. {
  30. $sql = "
  31. SELECT dt
  32. , COUNT(n) cntNew
  33. , COUNT(r) cntRe
  34. , COUNT(*) cntTot
  35. FROM (SELECT DATE_FORMAT(created_at, '%Y-%m-%d') AS dt
  36. , ip
  37. , CASE WHEN COUNT(*) = 1 THEN 1 END AS n
  38. , CASE WHEN COUNT(*) > 1 THEN 1 END AS r
  39. FROM visits
  40. WHERE created_at >= (LAST_DAY(NOW() - INTERVAL 1 month) + INTERVAL 1 DAY)
  41. AND created_at < LAST_DAY(NOW())
  42. GROUP BY DATE_FORMAT(created_at, '%Y-%m-%d')
  43. , ip
  44. ) f
  45. GROUP BY dt;
  46. ";
  47. return DB::select($sql);
  48. }
  49. /**
  50. * 오늘 방문자 수
  51. */
  52. public function todayCount(): int
  53. {
  54. if (!$result = Cache::get('todayVisitsCount'))
  55. {
  56. $sql = "
  57. SELECT COUNT(DISTINCT ip) AS total FROM visits WHERE created_at >= CURDATE() AND created_at < CURDATE() + INTERVAL 1 DAY AND ip IS NOT NULL AND ip <> '';
  58. ";
  59. $result = (int)DB::selectOne($sql)->total;
  60. Cache::put('todayVisitsCount', $result, ttl: 300);
  61. }
  62. return $result;
  63. }
  64. /**
  65. * 어제 방문자 수
  66. */
  67. public function yesterdayCount(): int
  68. {
  69. if (!$result = Cache::get('yesterdayVisitsCount'))
  70. {
  71. $sql = "
  72. SELECT COUNT(DISTINCT ip) AS total FROM visits WHERE created_at >= CURDATE() - INTERVAL 1 DAY AND created_at < CURDATE() AND ip IS NOT NULL AND ip <> '';
  73. ";
  74. $result = (int)DB::selectOne($sql)->total;
  75. Cache::put('yesterdayVisitsCount', $result, 86400);
  76. }
  77. return $result;
  78. }
  79. /**
  80. * 누적 방문자 수
  81. */
  82. public function totalCount(): int
  83. {
  84. if (!$result = Cache::get('totalVisitsCount'))
  85. {
  86. $sql = "
  87. SELECT COUNT(DISTINCT `ip`) AS `total` FROM `visits` WHERE `ip` IS NOT NULL AND `ip` <> '';
  88. ";
  89. $result = (int)DB::selectOne($sql)->total;
  90. Cache::put('totalVisitsCount', $result, 86400);
  91. }
  92. return $result;
  93. }
  94. }