En la lección anterior cargamos datos de prueba utilizando un administrador de base de datos, sin embargo esto trae como consecuencia que cada vez que ejecutemos migrate:refresh o migrate:fresh perdamos dichos datos. En esta lección veremos una mejor forma de cargar datos de prueba utilizando los Seeders de Laravel.

Repositorio

Ver el código de esta lección en GitHub

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Notas

Generar un seeder

Para generar un seeder utilizamos el comando de Artisan make:seeder seguido del nombre del seeder:

php artisan make:seeder ProfessionSeeder

Al ejecutar este comando se generará un archivo ProfessionSeeder.php dentro del directorio database/seeds.

Código del seeder

Dentro del método run() del archivo ProfessionSeeder.php escribimos el código de nuestro seeder:

class ProfessionSeeder extends Seeder
{
    public function run()
    {
        DB::table('professions')->insert([
            'title' => 'Desarrollador back-end',
        ]);
    }
}

Para insertar datos, utilizaremos el constructor de consultas SQL de Laravel. Que incluye una interfaz fluida para construir y ejecutar consultas a la base de datos. Para ello llamaremos al método table del Facade DB pasando como argumento el nombre de la tabla con la que queremos interactuar. El método insert acepta un array asociativo que representará las columnas y valores que queremos guardar en la tabla.

Para utilizar el facade DB:: debemos importar \Illuminate\Support\Facades\DB al principio del archivo:

<?php

// (namespace opcional aqui)

use Illuminate\Support\Facades\DB;

Registrar seeder

Los seeders son registrados en la clase DatabaseSeeder dentro de database/seeds/DatabaseSeeder.php. Dentro del método run llamamos al método call pasando como argumento el nombre de la clase de nuestro seeder:

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(ProfessionSeeder::class);
    }
}

En este caso ProfessionSeeder::class devolverá el nombre de la clase. En lugar de utilizar ::class también podemos pasar el nombre de la clase como una cadena de texto 'ProfessionalSeeder'.

Eliminar registros

Es posible que antes de ejecutar un seeder necesitemos eliminar el contenido existente. Para realizar esto podemos utilizar el método truncate, que se encarga de vaciar la table:

class ProfessionSeeder extends Seeder
{
    public function run()
    {
        DB::table('professions')->truncate();

        // ..
    }
}

Ejecutar un seeder

Para ejecutar los seeders utilizamos el comando db:seed desde la terminal:

php artisan db:seed

En caso de que tengas múltiples seeders, puedes pasar la opción --class que te permite ejecutar solamente el seeder pasado como argumento:

php artisan db:seed --class=ProfessionSeeder

También puedes ejecutar el comando migrate:fresh o migrate:refresh junto con los seeders pasando la opción --seed:

php artisan migrate:fresh --seed

Desactivar revisión de claves foráneas

Si una tabla tiene una referencia de clave foránea, necesitarás desactivar la revisión de claves foráneas utilizando un sentencia antes de vaciar dicha tabla (por ejemplo usando el método truncate).

Esto podemos lograrlo con la sentencia SQL SET FOREIGN_KEY_CHECKS=[0|1]. En Laravel podemos ejecutar dicha sentencia usando el método DB::statement de esta manera:

class ProfessionSeeder extends Seeder
{
    public function run()
    {
        DB::statement('SET FOREIGN_KEY_CHECKS = 0;'); // Desactivamos la revisión de claves foráneas
        DB::table('professions')->truncate();
        DB::statement('SET FOREIGN_KEY_CHECKS = 1;'); // Reactivamos la revisión de claves foráneas

        // ..
    }
}

Utilizando la misma sentencia pero con el valor 1 reactivamos la revisión de claves foráneas luego de ejecutar nuestro seeder.

En caso de que quieras vaciar varias tablas a la vez, puedes utilizar el siguiente código dentro de la clase DatabaseSeeder:

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->truncateTables([
            'nombre_de_la_tabla_aqui',
            'nombre_de_otra_tabla',
        ]);
  
        // Ejecutar los seeders:
        $this->call(ProfessionSeeder::class);
    }

    public function truncateTables(array $tables)
    {
        DB::statement('SET FOREIGN_KEY_CHECKS = 0;');

        foreach ($tables as $table) {
            DB::table($table)->truncate();
        }

        DB::statement('SET FOREIGN_KEY_CHECKS = 1;');
    }
}

Ahora podrás llamar al método truncateTables pasando un arreglo con los nombres de las tablas que quieras vaciar.

Contraseñas dentro de un seeder

En caso de que quieras insertar usuarios de esta manera, recuerda encriptar las contraseñas utilizando el helper bcrypt:

DB::table('users')->insert([
    // ..
    'password' => bcrypt('laravel')
]);
Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Crear y asociar tablas usando las migraciones de Laravel (con claves foráneas) Lección siguiente Constructor de consultas SQL de Laravel