Saltar al contenido principal

¿Qué es el seeding?

El seeding es un mecanismo para introducir en la base de datos datos de muestra o iniciales. Al preparar el entorno de desarrollo o al ejecutar pruebas automatizadas, suele necesitarse un estado inicial con datos. Introducirlos manualmente cada vez es costoso, así que se encapsulan en seeders para poder ejecutarlos repetidamente. Las clases seeder se guardan en el directorio database/seeders. Por defecto se incluye la clase DatabaseSeeder.

Creación de un seeder

Genera una nueva clase seeder con el comando Artisan make:seeder.
php artisan make:seeder UserSeeder
El archivo generado se ubica en database/seeders/UserSeeder.php.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Ejecuta el seeder
     */
    public function run(): void
    {
        // Escribe aquí la inserción de datos
    }
}

Implementación del seeder

Escribe la lógica de inserción dentro del método run(). Puedes usar la fachada DB o modelos Eloquent.

Usando la fachada DB

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
    public function run(): void
    {
        DB::table('users')->insert([
            [
                'name' => 'Taro Yamada',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'name' => 'Hanako Suzuki',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
        ]);
    }
}

Usando modelos Eloquent

use App\Models\User;
use Illuminate\Support\Facades\Hash;

public function run(): void
{
    User::create([
        'name' => 'Administrador',
        'email' => '[email protected]',
        'password' => Hash::make('password'),
    ]);
}
Durante el seeding la protección de mass assignment se desactiva automáticamente. Puedes insertar datos sin preocuparte por la configuración de $fillable o $guarded.

Combinación con las factories de modelo

Cuando necesitas grandes volúmenes de datos de prueba, resulta muy útil combinarlo con las factories de modelo. Con las factories puedes generar en bloque datos aleatorios ficticios.
use App\Models\User;
use App\Models\Post;

public function run(): void
{
    // Crea 10 usuarios
    User::factory(10)->create();

    // Crea 3 posts para cada uno de 5 usuarios
    User::factory(5)
        ->hasPosts(3)
        ->create();
}
Consulta la documentación de factories de Eloquent para más detalles sobre su uso.

Uso de DatabaseSeeder

DatabaseSeeder es el punto de entrada que gestiona la ejecución de múltiples seeders. Indica los seeders a ejecutar con call().
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class,
            CommentSeeder::class,
        ]);
    }
}
Los seeders se ejecutan en el orden en el que se pasan a call(). Si hay restricciones de clave foránea, ordénalos de forma que las tablas referidas se sembren primero (por ejemplo, usersposts).

Ejecución del seeder

Ejecutar todos los seeders

php artisan db:seed
Se invoca DatabaseSeeder y desde ahí se ejecutan en orden los seeders indicados en call().

Ejecutar solo un seeder concreto

Con la opción --class puedes indicar la clase seeder a ejecutar.
php artisan db:seed --class=UserSeeder

Ejecución junto con las migraciones

Añadiendo la opción --seed al comando migrate:fresh, recreas todas las tablas y luego ejecutas los seeders de una vez.
php artisan migrate:fresh --seed
Para ejecutar solo un seeder concreto, usa la opción --seeder.
php artisan migrate:fresh --seed --seeder=UserSeeder
migrate:fresh elimina y recrea todas las tablas. Se pierden todos los datos existentes, así que no lo uses en producción.

Ejecución en producción

Al intentar ejecutar el seeding en producción aparece un prompt de confirmación. Para ejecutarlo sin confirmación, usa --force.
php artisan db:seed --force
El seeding en producción puede sobrescribir o perder datos. Haz siempre una copia de seguridad antes de ejecutarlo.

Supresión de eventos del modelo

Si quieres evitar que se disparen los eventos del modelo (creating, created, etc.) durante el seeding, usa el trait WithoutModelEvents.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}
También se aplica a los seeders hijos ejecutados a través de call().

Ejemplo práctico: seeder de una aplicación blog

Ejemplo para preparar los datos iniciales de un blog con usuarios y posts.
// database/seeders/UserSeeder.php
class UserSeeder extends Seeder
{
    public function run(): void
    {
        User::factory(10)->create();
    }
}

// database/seeders/PostSeeder.php
class PostSeeder extends Seeder
{
    public function run(): void
    {
        // Crea entre 2 y 5 posts para cada usuario
        User::all()->each(function ($user) {
            Post::factory(rand(2, 5))->create([
                'user_id' => $user->id,
            ]);
        });
    }
}

// database/seeders/DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class, // Se ejecuta tras users
        ]);
    }
}
Cómo se ejecuta:
php artisan migrate:fresh --seed

Próximos pasos

Introducción a Eloquent

Aprende a obtener y manipular con Eloquent ORM los datos introducidos por los seeders.
Última modificación el 13 de julio de 2026