Laravel: Seeders (parte 9)

Archivos que vamos a tratar

  • /database/seeders/DatabaseSeeder.php
  • /migrations

Rellenaremos la base de datos con datos de prueba para hacer consultas con Eloquent.

Antes de crear Seeders y Factories, ejecutamos este comando:

php artisan migrate:reset

Esto eliminará todas las tablas de la base de datos. Lo hacemos porque vamos a eliminar las migraciones que creamos en el capítulo anterior, y vamos a agregar una columna a la tabla cursos manualmente, añadimos una columna llamada «categoría»:

    public function up()
    {
        Schema::create('cursos', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('description');
            $table->text('categoria'); // nueva columna
            $table->timestamps();
        });
    }

Luego abrimos el archivo DatabaseSeeder.php. Tenemos que escribir al principio de este archivo que estamos usando el modelo Curso:

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Curso; // añadimos esta línea

Y dentro de la función run() escribimos lo que practicábamos con Tinker en la lección anterior, para crear un registro:

    public function run()
    {
        $curso = new Curso();
        $curso->name('Laravel');
        $curso->description('El mejor Framework');
        $curso->categoria('Desarrollo web');

        $curso->save();
    }

Podemos ejecutar el comando fresh para que se borren y se creen todas las tablas de nuevo:

php artisan migrate:fresh

Y luego ejecutamos los seeders:

php artisan db:seed

Ya se ha añadido el primer registro. Añadamos tres a la vez:

    public function run()
    {
        $curso = new Curso();
        $curso->name='Laravel';
        $curso->description='El mejor Framework';
        $curso->categoria='Desarrollo web';

        $curso->save();
        
        $curso2 = new Curso();
        $curso2->name='Laravel';
        $curso2->description='El mejor Framework';
        $curso2->categoria='Desarrollo web';

        $curso2->save();
        
        $curso3 = new Curso();
        $curso3->name='Laravel';
        $curso3->description='El mejor Framework';
        $curso3->categoria='Desarrollo web';

        $curso3->save();
    }

Ejecutamos de nuevo los comandos para tener más registros en la base de datos:

php artisan migrate:fresh
php artisan db:seed

Pero lo podemos hacer mejor, creando un seeder para los cursos:

php artisan make:seeder CursoSeeder

Dentro del archivo CursoSeeder, pegamos los registros que creamos en DatabaseSeeder. Además, llamamos al modelo Curso como lo hicimos allí también. Y en DatabaseSeeder, en vez de la creación de registros de la función pública run (que ahora está en CursoSeeder):

$this->Call(CursoSeeder::class);

Ahora ejecutamos los dos comandos de artisan fresh y seed, pero esta vez lo haremos en una sola línea:

php artisan migrate:fresh --seed

Recursos

Enlace de Youtube: https://www.youtube.com/watch?v=zNTF3U2Hsq0&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=13

Seeders con tablas relacionadas: https://www.php-dev-zone.com/blog/seeding-table-with-relationships-in-laravel-8