ソースを参照

国家地区同步

seven 1 ヶ月 前
コミット
ff4a476cc7

+ 16 - 0
app/Models/Country.php

@@ -0,0 +1,16 @@
+<?php
+
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Country extends BaseModel
+{
+    protected $table = 'countries';
+    protected $fillable = ['name', 'code', 'flag', 'status'];
+
+    const STATUS_YES = 1;//正常
+    const STATUS_NO = 0;//禁用
+
+}

+ 12 - 0
app/Services/ApiFootball/Sdk.php

@@ -4,12 +4,24 @@
 
 class Sdk
 {
+
+    /**
+     * @description: 获取时区数据
+     * @return {array}
+     */    
     public function timezone()
     {
         $result = Client::timezone();
         return $result;
     }
 
+    /**
+     * @description: 获取国家/地区数据
+     * @param {array} $params.name 国家/地区名称(可选)
+      * @param {array} $params.code 国家/地区代码(可选) 
+      * @param {array} $params.search 国家/地区名称(可选) 
+     * @return {array}
+     */    
     public function countries($params = [])
     {
         $result = Client::countries($params);

+ 41 - 0
app/Services/SyncFootballDataService.php

@@ -4,9 +4,12 @@
 
 use App\Services\BaseService;
 use App\Models\Timezone;
+use App\Models\Country;
 
 class SyncFootballDataService extends BaseService
 {
+
+    // 同步时区数据
     public static function syncTimezone()
     {
         $result = app('api-football')->timezone();
@@ -37,4 +40,42 @@ public static function syncTimezone()
 
         return $result;
     }
+
+    // 同步国家/地区数据
+    public static function syncCountry()
+    {
+        $result = app('api-football')->countries();
+        $response = $result['response'] ?? [];
+        
+        if (empty($response)) {
+            return $result;
+        }
+
+        // 先将所有国家/地区设为无效
+        Country::query()->update(['status' => Country::STATUS_NO]);
+        
+        foreach ($response as $item) {
+            // 使用 firstOrCreate 简化代码
+            $country = Country::firstOrCreate(
+                ['code' => $item['code']],
+                [
+                    'name' => $item['name'],
+                    'code' => $item['code'],
+                    'flag' => $item['flag'],
+                    'status' => Country::STATUS_YES
+                ]
+            );
+            
+            // 如果已存在,更新状态和其他字段
+            if (!$country->wasRecentlyCreated) {
+                $country->update([
+                    'name' => $item['name'],
+                    'flag' => $item['flag'],
+                    'status' => Country::STATUS_YES
+                ]);
+            }
+        }
+
+        return $result;
+    }
 }

+ 33 - 0
database/migrations/2026_03_04_111111_create_countries_table.php

@@ -0,0 +1,33 @@
+<?php
+
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::create('countries', function (Blueprint $table) {
+            $table->id();
+            $table->string('name', 100)->comment('国家/地区名称');
+            $table->string('code', 2)->unique()->comment('国家/地区代码(2位字母)');
+            $table->string('flag', 255)->comment('国旗图标URL');
+            $table->integer('status')->nullable()->default(1)->comment('状态: 1-正常, 0-禁用');
+            $table->timestamps();
+            $table->comment('国家/地区表');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('countries');
+    }
+};

+ 1 - 1
routes/admin.php

@@ -8,5 +8,5 @@
 use App\Services\SyncFootballDataService;
 
 Route::get('/test', function () {
-    return SyncFootballDataService::syncTimezone();
+    return SyncFootballDataService::syncCountry();
 });