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