tarunkorat/laravel-migration-squasher
Squash old Laravel migrations into a single schema file
composer require tarunkorat/laravel-migration-squasher
Documentation
Laravel Migration Squasher
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!
โจ Features
- ๐๏ธ 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
๐ Requirements
- PHP 8.0 or higher
- Laravel 8.x, 9.x, 10.x, 11.x, or 12.x
- Doctrine DBAL (automatically installed)
๐ฆ Installation
Install the package via composer:
composer require tarunkorat/laravel-migration-squasher
The package will automatically register itself via Laravel's package discovery.
Publish Configuration (Optional)
php artisan vendor:publish --provider="TarunKorat\LaravelMigrationSquasher\MigrationSquasherServiceProvider"
This will create config/migration-squasher.php file.
๐ Usage
Basic Usage
Squash all migrations before a specific date, keeping the 10 most recent:
php artisan migrations:squash
Preview Changes (Dry Run)
See what would be squashed without making any changes:
php artisan migrations:squash --dry-run
Custom Options
# 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-run
โ๏ธ Configuration
The 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,
];
๐ Before & After Example
Before Squashing
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 ๐ฐ
After Squashing
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 ๐
๐ฏ When to Use This Package
โ Perfect For:
- 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)
โ Not Recommended For:
- New projects (< 6 months old with few migrations)
- Active feature branches (wait until merged to avoid conflicts)
- Projects that never run
migrate:fresh
๐ง How It Works
- 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)
Important Notes
- โ 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
๐งช Testing
composer test
๐ Performance Comparison
| 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 |
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
๐ Changelog
Please see CHANGELOG for more information on what has changed recently.
๐ Security
If you discover any security related issues, please email tarunkorat336@gmail.com instead of using the issue tracker.
๐ License
The MIT License (MIT). Please see License File for more information.
๐ก Credits
๐ Support
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
Please sign in to write a review