Laravel: Factories (parte 10)

Laravel: Factories (parte 10)

Archivos que vamos a tratar

  • /database/factories
  • /database/factories/UserFactory.php
  • /seeders/DatabaseSeeder.php
  • /seeders/CursoSeeder.php

¿Y si necesitamos 50 registros de prueba? Usaremos Factories para esto.

Creamos un Factory con el siguiente comando para la tabla cursos:

php artisan make:factory CursoFactory

Creará un documento llamado CursoFactory.php en la carpeta factories. En el documento creado, tendremos una clase que se extiende de la clase Factory.

En el curso se nos explica que podemos hacerlo con el siguiente comando, pero hemos visto en la práctica que no es necesario:

 php artisan make:factory CursoFactory --model=Curso

Lo que sí necesitamos es añadir al principio del archivo, después del namespace:

use App\Models\Curso;

Y al parecer esta línea, antes de la función definition no es necesaria, con lo que la dejamos comentada:

// protected $model = Curso::class;

Ahora definiremos todos los campos de nuestra tabla, dentro de la función definition() de la clase:

    public function definition()
    {
        return [
            //
            'name'=>$this->faker->sentence(),
            'category'=>$this->faker->paragraph(),
            'description'=>$this->faker->randomElement(['Desarrollo web','Diseño web'])
        ];
    }
  • Para hacer uso de uno de los métodos de esta clase, escribimos $this
  • Utilizamos el método faker
  • EL campo name se rellenará con una oración, por lo que usamos sentence()
  • El campo description se llenará con un párrafo
  • Para la categoría, se escogerá entre dos elementos de un array, por lo que pasamos la función randomElement con un array de dos elementos
  • Hay muchos más de tipos de datos que podemos rellenar con faker.

Editamos CursoSeeder eliminando todos los registros que pusimos antes:

 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();
    }

Y rellenaremos la tabla con 50 elementos:

    public function run()
    {
        Curso::factory(50)->create();
    }

Podemos ejecutar el comando fresh para que se borren y se creen todas las tablas de nuevo, y ejecutar los seeders. En la lección anterior vimos que podíamos hacerlo en una sola línea:

php artisan migrate:fresh --seed

Este es el momento en el que vamos a borrar nuestro seeder. No necesitamos el archivo CursoSeeder si creamos el factory y añadimos la línea correspondiente a CursoSeeder dentro de DatabaseSeeder. Estos es una recomendación de uso de la versión de Laravel que estamos trabajando. Así que, llegados a este punto:

  • Copiamos la línea Curso::factory(50)->create(); de CursoSeeder,
  • La pegamos en DatabaseSeeder,
  • Añadimos el modelo curso: use App\Models\Curso; al comienzo del arechivo DatabaseSeeder
  • Borramos el archivo CursoSeeder (ya no es necesario)

Si ejecutamos de nuevo:

php artisan migrate:fresh --seed

Todo funciona como anteriormente, sólo que nuestro código es más limpio y acorde a los estándares de uso.

Llenemos la tabla users con el factory del que ya nos provee Laravel. De momento no vamos a comentar el archivo UserFactory.php, pero podemos comprobar que es bastante parecido al CursoFactory.php que habíamos creado anteriormente. Nuestro archivo DatabaseSeeder quedará así (he eliminado los comentarios y añadido los míos para hacer hincapié en lo importante):

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Curso; // lo añadimos anteriormente para usar el factory Curso
use App\Models\User; // así podremos usar el factory User


class DatabaseSeeder extends Seeder
{
    public function run()
    {
        Curso::factory(50)->create(); //crea 50 registros
        User::factory(10)->create(); // esta línea viene escrita originalmente así: \App\Models\User::factory(10)->create();
    }
}

Terminamos con el comando de artisan que estábamos usando anteriormente, y luego comprobamos que las tablas se han rellenado con 50 y 10 registros aleatorios:

php artisan migrate:fresh --seed

Recursos:

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