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.
Related Tips
View all tips →Use Database Expressions for Dynamic Migration Defaults
Pass an Expression instance to Laravel's migration default() method to define raw SQL functions, dynamic timestamps, and calculated defaults directly in your database schema.
Index Dynamic JSON Attributes with Generated Virtual Columns
Use virtualAs() and storedAs() in migrations to create generated database columns for high-speed indexing on JSON attributes.