1. Base de datos
  2. Base de datos: Siembra

Únete a nuestra comunidad de Telegram @webblend!

Aquí encontrarás fragmentos de código de Laravel y consejos útiles sobre desarrollo web.

Introducción

Laravel incluye la capacidad de sembrar tu base de datos con datos mediante clases de semillas. Todas las clases de semillas 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 semillas, lo que te permite controlar el orden de siembra.

Nota La protección contra asignación masiva se desactiva automáticamente durante la siembra de la base de datos.

Escribir Sembradores

Para generar una clase de semilla, ejecuta el comando Artisan make:seeder. Todas las clases de semillas generadas por el framework se colocarán en el directorio database/seeders:

php artisan make:seeder UserSeeder

Una clase de semilla solo contiene un método por defecto: run. Este método se llama cuando se ejecuta el comando Artisan db:seed. Dentro del método run, puedes insertar datos en tu base de datos como desees. Puedes usar el constructor de consultas para insertar datos manualmente o puedes usar fábricas de modelos Eloquent.

Como ejemplo, modifiquemos la clase DatabaseSeeder predeterminada y agreguemos 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
{
/**
* Ejecuta los sembradores de la base de datos.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => Hash::make('password'),
]);
}
}

Nota Puedes hacer una sugerencia de tipo para 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.

Usar Fábricas de Modelos

Por supuesto, especificar manualmente los atributos para cada semilla de modelo es engorroso. En su lugar, puedes usar fábricas de modelos para generar convenientemente grandes cantidades de registros de bases de datos. Primero, revisa la documentación de las fábricas de modelos para aprender cómo definir tus fábricas.

Por ejemplo, creemos 50 usuarios, cada uno con un post relacionado:

use App\Models\User;
 
/**
* Ejecuta los sembradores de la base de datos.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}

Llamar a Sembradores Adicionales

Dentro de la clase DatabaseSeeder, puedes usar el método call para ejecutar clases de semillas adicionales. El uso del método call te permite dividir tu siembra de bases de datos en varios archivos para que ninguna clase de semilla sea demasiado grande. El método call acepta un array de clases de semillas que deben ejecutarse:

/**
* Ejecuta los sembradores de la base de datos.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}

Desactivar Eventos de Modelos

Mientras se ejecutan las semillas, es posible que desees evitar que los modelos envíen eventos. Puedes lograr esto utilizando el rasgo WithoutModelEvents. Cuando se usa, el rasgo WithoutModelEvents garantiza que no se envíen eventos de modelo, incluso si se ejecutan clases de semillas 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;
 
/**
* Ejecuta los sembradores de la base de datos.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}

Ejecutar Sembradores

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 semillas. Sin embargo, puedes usar la opción --class para especificar una clase de semilla 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 usando 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 utilizar para especificar una semilla específica para ejecutar:

php artisan migrate:fresh --seed
 
php artisan migrate:fresh --seed --seeder=UserSeeder

Forzar la Ejecución de Sembradores en Producción

Algunas operaciones de siembra pueden provocar la modificación o pérdida de datos. Para protegerte de ejecutar comandos de siembra en tu base de datos de producción, se te pedirá confirmación antes de ejecutar las semillas en el entorno production. Para forzar la ejecución de las semillas sin un aviso, utiliza la bandera --force:

php artisan db:seed --force