Skip to main content

Overview

The db:seed command has been extended with a --module option, allowing you to run seeders from a specific module’s namespace.

Syntax

php artisan db:seed [options]

Options

--module
string
The name of the module where the seeder resides
--class
string
The class name of the root seeder (defaults to DatabaseSeeder)
--database
string
The database connection to use
--force
boolean
Force the operation to run when in production

Usage

Run Module’s Default Seeder

Run the DatabaseSeeder from a specific module:
php artisan db:seed --module=blog
This will call Modules\Blog\Database\Seeders\DatabaseSeeder.

Run Specific Seeder from Module

Specify both the module and seeder class name:
php artisan db:seed --module=blog --class=PostSeeder
This will call Modules\Blog\Database\Seeders\PostSeeder.

Run Application Seeder

Without the --module option, it works like the standard Laravel command:
php artisan db:seed

How It Works

The command automatically qualifies the seeder class name with the module’s namespace:
protected function getSeeder()
{
    if ($module = $this->module()) {
        $default = $this->getDefinition()->getOption('class')->getDefault();
        $class = $this->input->getOption('class');
        
        if ($class === $default) {
            // Use module's DatabaseSeeder
            $class = $module->qualify($default);
        } elseif (! Str::contains($class, 'Database\\Seeders')) {
            // Qualify the class with module namespace
            $class = $module->qualify("Database\\Seeders\\{$class}");
        }
        
        return $this->laravel->make($class)
            ->setContainer($this->laravel)
            ->setCommand($this);
    }
    
    return parent::getSeeder();
}

Module Seeder Structure

Directory Structure

app-modules/
  blog/
    database/
      seeders/
        DatabaseSeeder.php
        PostSeeder.php
        CategorySeeder.php

Example DatabaseSeeder

<?php

namespace Modules\Blog\Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            CategorySeeder::class,
            PostSeeder::class,
        ]);
    }
}

Example PostSeeder

<?php

namespace Modules\Blog\Database\Seeders;

use Illuminate\Database\Seeder;
use Modules\Blog\Models\Post;

class PostSeeder extends Seeder
{
    public function run(): void
    {
        Post::factory()->count(50)->create();
    }
}

Calling Seeders Within Modules

When calling other seeders from within a module seeder, use the fully qualified class name or relative reference:
namespace Modules\Blog\Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        // Using fully qualified class names
        $this->call([
            \Modules\Blog\Database\Seeders\CategorySeeder::class,
            \Modules\Blog\Database\Seeders\PostSeeder::class,
        ]);
        
        // Or use relative class names (same namespace)
        $this->call([
            CategorySeeder::class,
            PostSeeder::class,
        ]);
    }
}

Examples

Seed Multiple Modules

# Seed blog module
php artisan db:seed --module=blog

# Seed user module
php artisan db:seed --module=user-management

# Seed products module with specific seeder
php artisan db:seed --module=products --class=ProductSeeder

Production Seeding

Use the --force flag to seed in production:
php artisan db:seed --module=blog --force

Specify Database Connection

php artisan db:seed --module=blog --database=mysql_secondary

Using with Factories

Module seeders work seamlessly with module factories:
namespace Modules\Blog\Database\Seeders;

use Illuminate\Database\Seeder;
use Modules\Blog\Models\Post;
use Modules\Blog\Models\Category;

class PostSeeder extends Seeder
{
    public function run(): void
    {
        // Create categories first
        $categories = Category::factory()->count(5)->create();
        
        // Create posts with random categories
        Post::factory()
            ->count(50)
            ->recycle($categories)
            ->create();
    }
}

Workflow Integration

Development

# Reset and seed in one command
php artisan migrate:fresh --seed --module=blog

Testing

Call seeders in your tests:
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class BlogTest extends TestCase
{
    use RefreshDatabase;
    
    public function test_blog_posts(): void
    {
        $this->artisan('db:seed', [
            '--module' => 'blog',
            '--class' => 'PostSeeder',
        ]);
        
        $this->assertDatabaseCount('posts', 50);
    }
}
Organize your module seeders by feature or entity type. Use the main DatabaseSeeder to orchestrate the seeding order.

See Also

Build docs developers (and LLMs) love