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.
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.
<?phpnamespace Database\Seeders;use Illuminate\Database\Seeder;class UserSeeder extends Seeder{ /** * Ejecuta el seeder */ public function run(): void { // Escribe aquí la inserción de datos }}
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.
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.
DatabaseSeeder es el punto de entrada que gestiona la ejecución de múltiples seeders. Indica los seeders a ejecutar con call().
<?phpnamespace 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, users → posts).