Squash old Laravel migrations into a single schema file to keep your migrations folder clean and manageable.
Fully compatible with Laravel 8, 9, 10, 11, and 12!
- ποΈ Squash old migrations into a single schema file
- π Keep recent migrations separate for easy tracking
- π Safe backup before any deletion
- π Faster migrations - reduce migrate:fresh time by 90%
- π― Laravel 8-12 compatible - works with all modern Laravel versions
- π Dry run mode - preview changes before applying
- π‘οΈ Database agnostic - works with MySQL, PostgreSQL, SQLite, SQL Server
- π Clean codebase - reduce migration clutter from 100+ to just a few files
- PHP 8.0 or higher
- Laravel 8.x, 9.x, 10.x, 11.x, or 12.x
- Doctrine DBAL (automatically installed)
Install the package via composer:
composer require tarunkorat/laravel-migration-squasherThe package will automatically register itself via Laravel's package discovery.
php artisan vendor:publish --provider="TarunKorat\LaravelMigrationSquasher\MigrationSquasherServiceProvider"This will create config/migration-squasher.php file.
Squash all migrations before a specific date, keeping the 10 most recent:
php artisan migrations:squashSee what would be squashed without making any changes:
php artisan migrations:squash --dry-run# Squash migrations before specific date
php artisan migrations:squash --before=2024-01-01
# Keep specific number of recent migrations
php artisan migrations:squash --keep=15
# Disable backup creation
php artisan migrations:squash --no-backup
# Delete migration records from database
php artisan migrations:squash --delete-records
# Combine multiple options
php artisan migrations:squash --before=2023-06-01 --keep=20 --dry-runThe config file provides several options:
return [
// Date before which migrations will be squashed
'squash_before' => env('MIGRATION_SQUASH_BEFORE', '2024-01-01'),
// Number of recent migrations to keep separate
'keep_recent' => (int) env('MIGRATION_SQUASH_KEEP_RECENT', 10),
// Name of the generated schema dump file
'schema_file' => '0000_00_00_000000_schema_dump.php',
// Create backup of squashed migrations
'backup_migrations' => env('MIGRATION_SQUASH_BACKUP', true),
// Backup directory path
'backup_path' => env('MIGRATION_SQUASH_BACKUP_PATH', 'migrations/backup'),
// Tables to exclude from schema dump
'excluded_tables' => [
'migrations',
],
// Delete migration records from database
'delete_batch_records' => false,
];database/migrations/
βββ 2022_01_15_100000_create_users_table.php
βββ 2022_01_15_100001_create_password_resets_table.php
βββ 2022_02_20_140000_create_posts_table.php
βββ 2022_02_20_140001_add_slug_to_posts_table.php
... (96 more old files)
βββ 2024_10_15_140000_add_thumbnail_to_posts_table.php
βββ 2024_10_20_150000_create_notifications_table.php
βββ 2024_10_25_160000_add_verified_at_to_users_table.php
Total: 100 migration files π°
database/migrations/
βββ 0000_00_00_000000_schema_dump.php β (Entire schema in ONE file)
βββ 2024_10_15_add_thumbnail_to_posts.php (Recent - Kept)
βββ 2024_10_20_create_notifications.php (Recent - Kept)
βββ 2024_10_25_add_verified_at_to_users.php (Recent - Kept)
Total: 4 migration files π
- Long-running projects (1+ years old with 50+ migrations)
- Performance optimization (speed up
migrate:freshby 90%) - Team onboarding (new developers see clean migration history)
- CI/CD pipelines (faster test suite execution)
- Before major releases (clean slate for v2.0)
- New projects (< 6 months old with few migrations)
- Active feature branches (wait until merged to avoid conflicts)
- Projects that never run
migrate:fresh
- Analyzes all migrations in your project
- Identifies migrations older than specified date
- Keeps the most recent N migrations separate
- Generates a schema dump from your current database structure
- Creates backup of squashed migrations (optional)
- Deletes old migration files
- Updates migrations table (optional)
- β Your database stays exactly the same - no data is modified
- β Only migration files are affected
- β Always creates backups before deletion (unless disabled)
- β Safe to run - uses dry-run mode first
composer test| Metric | Before Squash | After Squash | Improvement |
|---|---|---|---|
| Migration Files | 167 files | 11 files | 93% reduction |
migrate:fresh Time |
8 minutes | 45 seconds | 90% faster |
| CI/CD Pipeline | 2 min migrations | 30 sec migrations | 75% faster |
| Codebase Clarity | Cluttered | Clean | Much better |
Contributions are welcome! Please feel free to submit a Pull Request.
Please see CHANGELOG for more information on what has changed recently.
If you discover any security related issues, please email tarunkorat336@gmail.com instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.
If you find this package helpful, please consider:
- β Starring the repository
- π Reporting bugs and issues
- π Contributing to documentation
- π¬ Sharing with other Laravel developers
Made with β€οΈ for the Laravel community