H
H
HexaDev
Back to All Articles
Laravel

Mastering Database Migrations and Seeding in Laravel

Apr 25, 2026 5 min read
Mastering Database Migrations and Seeding in Laravel

Understanding Database Migrations

Database migrations are a vital part of any Laravel application. They allow developers to define the structure of their database using PHP code, making it easy to version control and share changes with the team. Migrations are essentially version-controlled files that define the changes to be made to the database schema.

Creating a Migration

To create a migration in Laravel, you can use the Artisan command-line tool. For example, if you want to create a table for users, you can run:

php artisan make:migration create_users_table --create=users

This command generates a migration file in the database/migrations directory. Inside this file, you can define the schema for the users table:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamps();
    });
}

Running Migrations

Once you have defined your migration, you can run it using the following command:

php artisan migrate

This command updates your database schema to match the migrations that have not yet been run. Laravel keeps track of which migrations have been executed in a special migrations table.

Database Seeding

After setting up your database schema, it’s often useful to populate your database with sample data. This is where database seeding comes into play. Laravel provides a convenient way to seed your database using the DatabaseSeeder class.

To create a seeder for the users table, you can run:

php artisan make:seeder UsersTableSeeder

Now, you can add sample data within the run method of the generated class:

public function run()
{
    DB::table('users')->insert([
        ['name' => 'John Doe', 'email' => '[email protected]'],
        ['name' => 'Jane Doe', 'email' => '[email protected]'],
    ]);
}

Running Seeders

To run your seeder, you can execute the following command:

php artisan db:seed --class=UsersTableSeeder

You can also run all seeders defined in the DatabaseSeeder class by simply using:

php artisan db:seed

This command will execute all the seeders that you have registered in the run method of the DatabaseSeeder.

Real-World Example: Setting Up a Blog

Let’s consider a simple application for a blog. We need two tables: posts and comments. First, we create migrations for both:

php artisan make:migration create_posts_table --create=posts
php artisan make:migration create_comments_table --create=comments

In the create_posts_table migration, we might have:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('content');
        $table->timestamps();
    });
}

And for create_comments_table:

public function up()
{
    Schema::create('comments', function (Blueprint $table) {
        $table->id();
        $table->foreignId('post_id')->constrained()->onDelete('cascade');
        $table->text('comment');
        $table->timestamps();
    });
}

Next, we create seeders for both tables. The PostsTableSeeder might look like this:

public function run()
{
    DB::table('posts')->insert([
        ['title' => 'First Post', 'content' => 'This is the content of the first post.'],
        ['title' => 'Second Post', 'content' => 'This is the content of the second post.'],
    ]);
}

In the CommentsTableSeeder, we can seed comments related to the posts:

public function run()
{
    DB::table('comments')->insert([
        ['post_id' => 1, 'comment' => 'Great post!'],
        ['post_id' => 2, 'comment' => 'Thanks for sharing!'],
    ]);
}

Finally, we run our migrations and seeders:

php artisan migrate
php artisan db:seed

Key Takeaways

  • Database migrations in Laravel help manage your database schema efficiently.
  • Seeding allows you to populate your database with test data easily.
  • Using Artisan commands simplifies the process of creating and running migrations and seeders.
  • Version control of migrations ensures that your team maintains a consistent database structure.

Did you find this insightful?

Share this article with your network or get in touch for consultations.