Laravel Generate Migration from existing Model

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Laravel Generate Migration from Existing Model: A Developer's Guide

As a senior developer working with Laravel, understanding the relationship between Eloquent Models and database Migrations is fundamental. While Eloquent Models provide an elegant way to interact with your database through object-oriented means, database schema changes must be handled explicitly via migrations. This guide will walk you through the process of generating migration files from existing models or working backward from existing migrations, ensuring you maintain clean, reproducible, and robust database structures.

The Core Concept: Separation of Concerns

Before diving into the commands, it’s crucial to understand the separation of concerns in Laravel:

  1. Models (Eloquent): Define the structure for application logic, relationships, and business rules. They map PHP objects to database rows.
  2. Migrations: Define the actual structural changes to the database schema (tables, columns, indexes). They are the blueprint for your data persistence layer.

A model implies a table structure, but it does not automatically generate the migration file; you must explicitly write the migration to execute those changes in the database.

Scenario 1: Creating a Migration from an Existing Model

You often start with an existing Eloquent Model and need to synchronize your database schema with that model's properties. There isn't a single "dump model to migration" command, as this process requires careful consideration of data types, indexes, and foreign keys specific to your application. The best practice involves using the model as a source for writing the migration file.

Step-by-Step Process:

  1. Identify the Table: Determine which table corresponds to your Model (e.g., the posts table for the Post model).

  2. Generate the Migration Shell: Use the Artisan command to create a new, empty migration file.

    bash
    php artisan make:migration create_posts_table --create=posts

    Note: Using the --create flag is beneficial when creating a brand new table.

  3. Populate the Migration: Open the newly created migration file (located in database/migrations) and define the schema using the Schema facade. This is where you translate your Model's attributes into SQL commands.

    For example, if your Post model has title, body, and user_id columns:

    php
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Support\Facades\Schema;
    
    class CreatePostsTable extends Migration
    {
        public function up(): void
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->id(); // Primary key automatically added by Laravel convention
                $table->string('title');
                $table->text('body');
                $table->foreignId('user_id')->constrained()->onDelete('cascade'); // Reflecting the relationship
                $table->timestamps(); // Created_at and Updated_at fields
            });
        }
    
        public function down(): void
        {
            Schema::dropIfExists('posts');
        }
    }

This manual approach gives you full control. When working within the Laravel ecosystem, leveraging tools like Eloquent to understand model relationships is key before writing these schema definitions, as detailed in the official documentation at laravelcompany.com.

Scenario 2: Reversing the Process (Migration to Model)

The reverse process—deriving an Eloquent Model from an existing Migration—is often simpler and more reliable, especially when dealing with established database structures.

If you have a migration that successfully created a table, you can use this structure to define your Model. The key is to ensure the model's class properties align perfectly with the columns defined in the migration.

For instance, if you have a migration defining a products table:

php
// In your migration file...
Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->decimal('price', 8, 2);
    $table->timestamps();
});

You would then create the corresponding Model:

php
// In your app/Models/Product.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;

    // Eloquent automatically maps these based on conventions, but you can explicitly define them:
    protected $fillable = ['name', 'price'];
}

This demonstrates the powerful synchronization between migrations and models. When managing complex applications, maintaining this consistency is vital for smooth development and data integrity.

Conclusion

Generating migrations from existing models or vice versa requires a developer to act as the translator between application logic (Models) and database structure (Migrations). While direct automated generation isn't standard, by adopting a disciplined approach—using Artisan commands to scaffold files and manually mapping Model attributes to Schema definitions—you ensure that your Laravel application remains robust, scalable, and adheres to best practices. Always refer back to the comprehensive guides available at laravelcompany.com for deeper insights into Eloquent and migration management.