SyncFootballDataService.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace App\Services;
  3. use App\Services\BaseService;
  4. use App\Models\Timezone;
  5. use App\Models\Country;
  6. use App\Models\League;
  7. class SyncFootballDataService extends BaseService
  8. {
  9. // 同步时区数据
  10. public static function syncTimezone()
  11. {
  12. $result = app('api-football')->timezone();
  13. $response = $result['response'] ?? [];
  14. if (empty($response)) {
  15. return $result;
  16. }
  17. // 先将所有时区设为无效
  18. Timezone::query()->update(['status' => Timezone::STATUS_NO]);
  19. foreach ($response as $code) {
  20. // 使用 firstOrCreate 简化代码
  21. $timezone = Timezone::firstOrCreate(
  22. ['code' => $code],
  23. [
  24. 'code' => $code,
  25. 'status' => Timezone::STATUS_YES
  26. ]
  27. );
  28. // 如果已存在,更新状态
  29. if (!$timezone->wasRecentlyCreated) {
  30. $timezone->update(['status' => Timezone::STATUS_YES]);
  31. }
  32. }
  33. return $result;
  34. }
  35. // 同步国家/地区数据
  36. public static function syncCountry()
  37. {
  38. $result = app('api-football')->countries();
  39. $response = $result['response'] ?? [];
  40. if (empty($response)) {
  41. return $result;
  42. }
  43. // 先将所有国家/地区设为无效
  44. Country::query()->update(['status' => Country::STATUS_NO]);
  45. foreach ($response as $item) {
  46. // 使用 firstOrCreate 简化代码
  47. $country = Country::firstOrCreate(
  48. ['name' => $item['name']],
  49. [
  50. 'name' => $item['name'],
  51. 'code' => $item['code'],
  52. 'flag' => $item['flag'],
  53. 'status' => Country::STATUS_YES
  54. ]
  55. );
  56. // 如果已存在,更新状态和其他字段
  57. if (!$country->wasRecentlyCreated) {
  58. $country->update([
  59. 'code' => $item['code'],
  60. 'flag' => $item['flag'],
  61. 'status' => Country::STATUS_YES
  62. ]);
  63. }
  64. }
  65. return $result;
  66. }
  67. public static function syncLeagues($params = [])
  68. {
  69. $result = app('api-football')->leagues($params);
  70. // $result = json_decode(file_get_contents(storage_path('logs/leagues.log')), true);
  71. $response = $result['response'] ?? [];
  72. if (empty($response)) {
  73. return $result;
  74. }
  75. // // 先将所有联赛设为无效
  76. // League::query()->update(['status' => League::STATUS_NO]);
  77. foreach ($response as $item) {
  78. $is_active = League::IS_ACTIVE_NOT;
  79. foreach ($item['seasons'] as $season) {
  80. // 处理赛季数据
  81. if ($season['current']) {
  82. $is_active = League::IS_ACTIVE_YES;
  83. }
  84. }
  85. // 使用 updateOrCreate 简化代码
  86. $league = League::updateOrCreate(
  87. ['league_id' => $item['league']['id']],
  88. [
  89. 'name' => $item['league']['name'],
  90. 'type' => $item['league']['type'],
  91. 'logo' => $item['league']['logo'],
  92. 'country_name' => $item['country']['name'],
  93. 'country_code' => $item['country']['code'],
  94. 'country_flag' => $item['country']['flag'],
  95. 'seasons' => json_encode($item['seasons'] ?? []),
  96. 'is_active' => $is_active,
  97. 'last_synced_at' => now(),
  98. ]
  99. );
  100. // // 如果已存在,更新状态和其他字段
  101. // if (!$league->wasRecentlyCreated) {
  102. // $league->update([
  103. // 'name' => $item['league']['name'],
  104. // 'type' => $item['league']['type'],
  105. // 'logo' => $item['league']['logo'],
  106. // 'country_name' => $item['country']['name'],
  107. // 'country_code' => $item['country']['code'],
  108. // 'country_flag' => $item['country']['flag'],
  109. // 'seasons' => json_encode($item['seasons'] ?? []),
  110. // 'is_active' => $is_active,
  111. // ]);
  112. // }
  113. }
  114. return $result;
  115. }
  116. }