Laravel Database

Eliminate Migration Class Name Collisions with Anonymous Migrations

Punyapal Shah 1 min read
edit this tip
Use anonymous class migrations (return new class extends Migration) to eliminate class name collisions in large Laravel applications.

In traditional Laravel migrations, class names (such as class CreateUsersTable) had to match the filename. When modifying tables across multiple versions or running multi-package apps, class name collisions frequently broke migration suites.

Laravel uses anonymous migration classes by default.

Anonymous Migration Structure

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('subscriptions', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->cascadeOnDelete();
            $table->string('stripe_id')->unique();
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('subscriptions');
    }
};

Generating Anonymous Migrations

Standard Artisan commands generate anonymous migrations automatically:

php artisan make:migration create_subscriptions_table

Summary

  • Prevents class redeclaration errors when adding multiple migrations for the same table.
  • Removes the need to maintain matching class and file names.
  • Default standard across all modern Laravel versions.
Tags: Laravel Database Migrations Clean Code
Share on X

// Found an issue or want to contribute a tip? github.com/MrPunyapal/tips