Looking to hire Laravel developers? Try LaraJobs

laravel-migration-squasher maintained by tarunkorat

Description
Squash old Laravel migrations into a single schema file
Author
Last update
2025/10/30 13:05 (dev-main)
License
Links
Downloads
77

Comments
comments powered by Disqus

Laravel Migration Squasher

Latest Version on Packagist Total Downloads License

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:fresh by 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

  1. Analyzes all migrations in your project
  2. Identifies migrations older than specified date
  3. Keeps the most recent N migrations separate
  4. Generates a schema dump from your current database structure
  5. Creates backup of squashed migrations (optional)
  6. Deletes old migration files
  7. 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