#Introducción
Laravel incluye la capacidad de poblar su base de datos con datos usando clases seeders. Todas las clases seeders se almacenan en el directorio database/seeders. Por defecto, se define una clase DatabaseSeeder para usted. Desde esta clase, puede usar el método call para ejecutar otras clases seeders, lo que le permite controlar el orden de la siembra.
La protección contra asignación masiva se desactiva automáticamente durante la siembra de la base de datos.
#Escribiendo Seeders
Para generar un seeder, ejecute el comando Artisan make:seeder. Todos los seeders generados por el framework se colocarán en el directorio database/seeders:
php artisan make:seeder UserSeeder
Una clase seeder contiene por defecto solo un método: run. Este método se llama cuando se ejecuta el comando Artisan db:seed. Dentro del método run, puede insertar datos en su base de datos como desee. Puede usar el query builder para insertar datos manualmente o puede usar Eloquent model factories.
Como ejemplo, modifiquemos la clase DatabaseSeeder por defecto y añadamos una instrucción de inserción en la base de datos dentro del 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
{
/**
* Ejecutar los seeders de la base de datos.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
Puede indicar cualquier dependencia que necesite en la firma del método run. Estas se resolverán automáticamente a través del service container de Laravel.
#Usando Model Factories
Por supuesto, especificar manualmente los atributos para cada modelo en el seeder es tedioso. En su lugar, puede usar model factories para generar cómodamente grandes cantidades de registros en la base de datos. Primero, revise la documentación de model factories para aprender cómo definir sus factories.
Por ejemplo, creemos 50 usuarios, cada uno con un post relacionado:
use App\Models\User;
/**
* Ejecutar los seeders de la base de datos.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
#Llamando Seeders adicionales
Dentro de la clase DatabaseSeeder, puede usar el método call para ejecutar clases seeders adicionales. Usar el método call le permite dividir la siembra de la base de datos en múltiples archivos para que ninguna clase seeder sea demasiado grande. El método call acepta un arreglo de clases seeders que deben ejecutarse:
/**
* Ejecutar los seeders de la base de datos.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
#Silenciando eventos de modelos
Al ejecutar seeders, puede que desee evitar que los modelos disparen eventos. Puede lograr esto usando el trait WithoutModelEvents. Cuando se usa, el trait WithoutModelEvents asegura que no se disparen eventos de modelos, incluso si se ejecutan clases seeders adicionales mediante el método call:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Ejecutar los seeders de la base de datos.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}
#Ejecutando Seeders
Puede ejecutar el comando Artisan db:seed para sembrar su base de datos. Por defecto, el comando db:seed ejecuta la clase Database\Seeders\DatabaseSeeder, que a su vez puede invocar otras clases seeders. Sin embargo, puede usar la opción --class para especificar una clase seeder específica para ejecutar individualmente:
php artisan db:seed
php artisan db:seed --class=UserSeeder
También puede sembrar su base de datos usando el comando migrate:fresh en combinación con la opción --seed, que eliminará todas las tablas y volverá a ejecutar todas sus migraciones. Este comando es útil para reconstruir completamente su base de datos. La opción --seeder puede usarse para especificar un seeder específico para 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 causar que modifique o pierda datos. Para protegerlo de ejecutar comandos de siembra en su base de datos de producción, se le pedirá confirmación antes de que los seeders se ejecuten en el entorno production. Para forzar la ejecución de los seeders sin una confirmación, use la bandera --force:
php artisan db:seed --force