Files
SkinbaseNova/database/migrations/2026_03_19_120000_create_countries_table.php
2026-03-20 21:17:26 +01:00

91 lines
3.2 KiB
PHP

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
if (! Schema::hasTable('countries')) {
$this->createCountriesTable();
return;
}
if (Schema::hasColumn('countries', 'id') && Schema::hasColumn('countries', 'iso2')) {
return;
}
$legacyCountries = DB::table('countries')->get();
Schema::drop('countries');
$this->createCountriesTable();
foreach ($legacyCountries as $country) {
$iso2 = strtoupper(trim((string) ($country->iso ?? '')));
if ($iso2 === '' || ! preg_match('/^[A-Z]{2}$/', $iso2)) {
continue;
}
DB::table('countries')->insert([
'iso' => $iso2,
'iso2' => $iso2,
'name' => $country->name ?? null,
'native' => $country->native ?? null,
'phone' => $country->phone ?? null,
'continent' => $country->continent ?? null,
'capital' => $country->capital ?? null,
'currency' => $country->currency ?? null,
'languages' => $country->languages ?? null,
'name_common' => $country->name ?? $iso2,
'name_official' => $country->native ?? null,
'active' => true,
'sort_order' => 1000,
'is_featured' => false,
'created_at' => now(),
'updated_at' => now(),
]);
}
}
public function down(): void
{
Schema::dropIfExists('countries');
}
private function createCountriesTable(): void
{
Schema::create('countries', function (Blueprint $table): void {
$table->id();
$table->char('iso', 2)->nullable()->unique();
$table->char('iso2', 2)->unique();
$table->char('iso3', 3)->nullable()->index();
$table->string('numeric_code', 3)->nullable();
$table->string('name', 255)->nullable();
$table->string('native', 255)->nullable();
$table->string('phone', 50)->nullable();
$table->char('continent', 2)->nullable();
$table->string('capital', 255)->nullable();
$table->string('currency', 32)->nullable();
$table->string('languages', 255)->nullable();
$table->string('name_common', 255);
$table->string('name_official', 255)->nullable();
$table->string('region', 120)->nullable();
$table->string('subregion', 120)->nullable();
$table->text('flag_svg_url')->nullable();
$table->text('flag_png_url')->nullable();
$table->string('flag_emoji', 16)->nullable();
$table->boolean('active')->default(true);
$table->unsignedInteger('sort_order')->default(1000);
$table->boolean('is_featured')->default(false);
$table->timestamps();
$table->index('active');
$table->index('name_common');
$table->index(['is_featured', 'sort_order']);
});
}
};