feat: referral_code

This commit is contained in:
2026-06-06 12:21:30 +03:30
parent 20d4336877
commit 0f5f7835e7
4 changed files with 96 additions and 2 deletions
@@ -0,0 +1,49 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
if (!Schema::hasColumn('users', 'referral_code')) {
$table->string('referral_code', 12)->nullable()->unique()->after('uuid');
}
if (!Schema::hasColumn('users', 'referred_by')) {
$table->foreignId('referred_by')->nullable()->after('referral_code')
->constrained('users')->nullOnDelete();
}
});
// Backfill a unique referral code for existing users
$existing = DB::table('users')->whereNull('referral_code')->pluck('id');
$used = DB::table('users')->whereNotNull('referral_code')->pluck('referral_code')->all();
$used = array_flip($used);
foreach ($existing as $id) {
do {
$code = strtoupper(Str::random(8));
} while (isset($used[$code]));
$used[$code] = true;
DB::table('users')->where('id', $id)->update(['referral_code' => $code]);
}
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
if (Schema::hasColumn('users', 'referred_by')) {
$table->dropForeign(['referred_by']);
$table->dropColumn('referred_by');
}
if (Schema::hasColumn('users', 'referral_code')) {
$table->dropColumn('referral_code');
}
});
}
};