tarunkorat / laravel-migration-squasher
Squash old Laravel migrations into a single schema file
Fund package maintenance!
tarunkorat
Installs: 8
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 0
Forks: 0
Open Issues: 1
pkg:composer/tarunkorat/laravel-migration-squasher
Requires
- php: ^8.0|^8.1|^8.2|^8.3
- doctrine/dbal: ^3.0|^4.0
- illuminate/console: ^8.0|^9.0|^10.0|^11.0|^12.0
- illuminate/database: ^8.0|^9.0|^10.0|^11.0|^12.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0|^12.0
Requires (Dev)
- mockery/mockery: ^1.6
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0|^10.0
- phpunit/phpunit: ^9.5|^10.0|^11.0
README
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