Saltar contenido

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