Base de datos: Población
Introducción
Laravel incluye la capacidad de llenar tu base de datos con datos utilizando clases de seed. Todas las clases de seed se almacenan en el directorio database/seeders
. Por defecto, se define una clase DatabaseSeeder
para ti. Desde esta clase, puedes usar el método call
para ejecutar otras clases de seed, lo que te permite controlar el orden de llenado.
[!NOTE] La protección contra la asignación masiva se desactiva automáticamente durante la siembra de la base de datos.
Escribiendo Seeders
Para generar un seeder, ejecuta el comando make:seeder
Artisan. Todos los seeders generados por el framework se colocarán en el directorio database/seeders
:
php artisan make:seeder UserSeeder
Una clase de seeder solo contiene un método por defecto: run
. Este método se llama cuando se ejecuta el comando db:seed de Artisan. Dentro del método run
, puedes insertar datos en tu base de datos como desees. Puedes usar el query builder para insertar datos manualmente o puedes usar factory de modelos Eloquent.
Como ejemplo, vamos a modificar la clase DatabaseSeeder
predeterminada y añadir una declaración de inserción en la base de datos al método run
:
<?php namespace Database\Seeders; 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 seeders. */ public function run(): void { DB::table('users')->insert([ 'name' => Str::random(10), 'email' => Str::random(10).'@example.com', 'password' => Hash::make('password'), ]); }}
[!NOTA] Puedes indicar cualquier dependencia que necesites dentro de la firma del método
run
. Se resolverán automáticamente a través del contenedor de servicios de Laravel.
Usando Factories de Modelos
Por supuesto, especificar manualmente los atributos para cada siembra de modelo es engorroso. En su lugar, puedes usar fábricas de modelos para generar convenientemente grandes cantidades de registros de base de datos. Primero, revisa la documentación de fábricas de modelos para aprender a definir tus fábricas. Por ejemplo, vamos a crear 50 usuarios que cada uno tiene una publicación relacionada:
use App\Models\User; /** * Run the database seeders. */public function run(): void{ User::factory() ->count(50) ->hasPosts(1) ->create();}
Llamando a Seeders Adicionales
Dentro de la clase DatabaseSeeder
, puedes usar el método call
para ejecutar clases de siembra adicionales. Usar el método call
te permite dividir la siembra de tu base de datos en múltiples archivos para que ninguna clase de sembrador se vuelva demasiado grande. El método call
acepta un array de clases de sembrador que deben ser ejecutadas:
/** * Run the database seeders. */public function run(): void{ $this->call([ UserSeeder::class, PostSeeder::class, CommentSeeder::class, ]);}
Silenciando Eventos de Modelo
Mientras ejecutas las semillas, puede que desees prevenir que los modelos despachen eventos. Puedes lograr esto utilizando el trait WithoutModelEvents
. Cuando se utiliza, el trait WithoutModelEvents
asegura que no se despachen eventos de modelo, incluso si se ejecutan clases de semillas adicionales a través del método call
:
<?php namespace Database\Seeders; use Illuminate\Database\Seeder;use Illuminate\Database\Console\Seeds\WithoutModelEvents; class DatabaseSeeder extends Seeder{ use WithoutModelEvents; /** * Run the database seeders. */ public function run(): void { $this->call([ UserSeeder::class, ]); }}
Ejecutando Seeders
Puedes ejecutar el comando Artisan db:seed
para sembrar tu base de datos. Por defecto, el comando db:seed
ejecuta la clase Database\Seeders\DatabaseSeeder
, que a su vez puede invocar otras clases de siembra. Sin embargo, puedes usar la opción --class
para especificar una clase de sembrador específica para ejecutar de forma individual:
php artisan db:seed php artisan db:seed --class=UserSeeder
También puedes sembrar tu base de datos utilizando el comando migrate:fresh
en combinación con la opción --seed
, que eliminará todas las tablas y volverá a ejecutar todas tus migraciones. Este comando es útil para reconstruir completamente tu base de datos. La opción --seeder
se puede usar para especificar un sembrador específico a ejecutar:
php artisan migrate:fresh --seed php artisan migrate:fresh --seed --seeder=UserSeeder
Forzar la Ejecución de Seeders en Producción
Algunas operaciones de siembra pueden hacer que alteres o pierdas datos. Para protegerte de ejecutar comandos de siembra contra tu base de datos de producción, se te pedirá confirmación antes de que se ejecuten los seeders en el entorno production
. Para forzar a que los seeders se ejecuten sin un aviso, utiliza el flag --force
:
php artisan db:seed --force