Introducción
Laravel incluye un método sencillo para alimentar tu base de datos con datos de prueba usando clases Seeder
. Todas las clases Seeder
son almacenadas en el directorio database/seeds
. Las clases Seeder
pueden tener cualquier nombre que desees, pero deberías seguir probablemente alguna convención razonable, tales como UsersTableSeeder
etc. De forma predeterminada, una clase DatabaseSeeder
se define para ti. A partir de esta clase, puedes usar el método call
para registrar otras clases seeder, permitiendo que controles el orden en que se ejecutan.
Escribiendo seeders
Para generar un seeder, ejecuta el Comando Artisan make:seeder
. Todos los seeders generados por el framework serán colocados en el directorio database/seeds
:
php artisan make:seeder UsersTableSeeder
Una clase seeder contiene solamente un método de forma predeterminada: run
. Este método es llamado cuando el comando Artisan db:seed
se ejecuta. Dentro del método run
, puedes insertar datos en tu base de datos en la forma que desees. Puedes usar el constructor de consultas para insertar datos manualmente o puedes usar los Model Factories de Eloquent.
La protección de asignación masiva es deshabilitada automáticamente durante el seeding de la base de datos.
Como un ejemplo, vamos a modificar la clase DatabaseSeeder
predeterminada y agregar una instrucción insert al método run
:
<?php use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('users')->insert([ 'name' => Str::random(10), 'email' => Str::random(10).'@gmail.com', 'password' => Hash::make('password'), ]); } }
Puedes definir cualquier dependencia que necesites dentro de la firma del método run
. Se resolverán automáticamente a través del contenedor de servicio de Laravel.
Usando model factories
Ciertamente, especificar manualmente los atributos para cada seeder de modelos es lento y complicado. En lugar de eso, puedes usar Model Factories para generar convenientemente cantidades grandes de registros de bases de datos. Primero, revisa la documentación sobre model factories para aprender cómo definir tus factories. Una vez que hayas definido tus factories, puedes usar la función helper factory
para insertar registros dentro de tu base de datos.
Por ejemplo, vamos a crear 50 usuarios y agreguemos una relación con los posts para cada usuario:
/** * Run the database seeds. * * @return void */ public function run() { factory(App\User::class, 50)->create()->each(function ($user) { $user->posts()->save(factory(App\Post::class)->make()); }); }
Registrando seeders adicionales
Dentro de la clase DatabaseSeeder
, puedes usar el método call
para ejecutar clases seeder adicionales. Usar el método call
te permite separar el seeding de tu base de datos en varios archivos con el propósito de que no exista una clase seeder única que se vuelva extremadamente grande. Pasa el nombre de la clase seeder que deseas ejecutar:
/** * Run the database seeds. * * @return void */ public function run() { $this->call([ UsersTableSeeder::class, PostsTableSeeder::class, CommentsTableSeeder::class, ]); }
Ejecutando seeders
Una vez que hayas escrito tu seeder, puedes necesitar regenerar el cargador automático de Composer usando el comando dump-autoload
:
composer dump-autoload
Ahora puedes usar el comando Artisan db:seed
para alimentar tu base de datos. De forma predeterminada, el comando db:seed
ejecuta la clase DatabaseSeeder
, la cual puede ser usada para ejecutar otras clases seeder. Sin embargo, puedes usar la opción --class
para especificar que una clase seeder específica se ejecute individualmente:
php artisan db:seed php artisan db:seed --class=UsersTableSeeder
También puedes alimentar tu base de datos usando el comando migrate:fresh
, el cual eliminará todas las tablas y volverá a ejecutar todas tus migraciones. Este comando es útil para reconstruir tu base de datos completamente:
php artisan migrate:fresh --seed
Forzar la ejecución de seeders en producción
Algunas operaciones de seeding pueden causar que alteres o pierdas datos. Para protegerte de ejecutar comandos de seeding en tu base de datos de producción, te será solicitada una confirmación antes de que los seeders sean ejecutados. Para forzar la ejecución de los seeders sin confirmación, usa la opción --force
:
php artisan db:seed --force
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Base de datos: Migraciones - Documentación de Laravel 6 Lección siguiente Redis - Documentación de Laravel 6