Laravel 6.*

Laravel provee un sencillo método para insertar datos de prueba o los datos iniciales de tu aplicación en la base de datos, me refiero a los seeders. En esta lección crearemos un seeder para cargar las primeras notas de nuestro proyecto en la DB.

Esta lección incluye un video premium

Regístrate para ver este video y cientos de lecciones exclusivas.

Mira el código en GitHub: actual, resultado, comparación.

Generación de seeders

Un seeder no es más que una clase de PHP, podemos crearla manualmente o generarla usando el comando de Artisan make:seeder seguido del nombre del seeder:

php artisan make:seeder NoteSeeder

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

Insertar datos en la DB a través de un seeder

Dentro del método run() del archivo NoteSeeder.php escribiremos el siguiente código:

<?php

class NoteSeeder extends Seeder
{
    public function run()
    {
        DB::table('notes')->insert([
            'title' => 'Mi primera nota',
            'content' => 'Contenido de la primera nota',
        ]);
    }
}

Para insertar datos, utilizaremos el constructor de consultas de Laravel. Vamos a llamar al método table del Facade DB pasando como primer argumento el nombre de la tabla con la que queremos interactuar. Luego encadenamos el llamado al método insert que acepta un array asociativo con 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;

Ahora duplica las líneas dentro del método run para agregar más notas.

Registrar seeders

Los seeders son registrados en la clase DatabaseSeeder en 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:

<?php

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

NoteSeeder::class devolverá el nombre de la clase como una cadena de texto.

En lugar de utilizar ::class también podemos pasar el nombre de la clase como una cadena de texto 'NoteSeeder'. Pero la sintaxis anterior nos puede proveer de una advertencia si la clase no existe y de autocompletado en el IDE si la clase sí existe.

Ejecutar seeders

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=NoteSeeder

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

php artisan migrate:fresh --seed

Como aprendimos en la lección pasada al ejecutar el comando migrate:fresh se estarán borrando y recreando todas las tablas de tu base de datos, por lo tanto no vamos a tener datos repetidos generados por los seeders.

Agregando datos reales desde los seeders

Es importante cargar registros con contenido real o similar al contenido real que tendrá la aplicación, para poder probar el diseño adecuadamente. De hecho, si revisas la aplicación de notas en el navegador verás que cada nota puede tener dimensiones diferentes e incluso código HTML. Vamos a cargar estas notas más reales por medio de los seeders:

<?php

DB::table('notes')->insert([
    'title' => 'Instalación de Laravel',
    'content' => /* ? */,
]);

Puesto que el contenido de las notas reales puede contener HTML y varias líneas de código, voy a colocarlas en una carpeta notes dentro de database/seeds y a cargarlas en la nota utilizado el método get del Facade File:

<?php

DB::table('notes')->insert([
    'title' => 'Instalación de Laravel',
    'content' => File::get(__DIR__.'/notes/installation.html'),
]);

__DIR__ es una «constante mágica» de PHP que devuelve el directorio actual del archivo desde donde es utilizada. Esto funcionará porque el directorio notes es relativo al directorio donde está el seeder. Otra opción sería usar database_path('seeds/notes/installation.html).

Realiza el mismo paso para el resto de las notas «reales», elimina las notas de mentira y vuelve a ejecutar php artisan migrate:fresh --seed.

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

Lección anterior Creación de tablas con el sistema de migraciones en Laravel 6 Lección siguiente Obtener registros de la base de datos con Laravel