Factories en Laravel

Factories en Laravel

Los Factories son otra forma de crear datos de prueba en laravel, la diferencia principal con los seeders es que con los Factories podemos crear varios registros de manera aleatoria en nuestra base de datos de manera fácil (10, 100, 1000 registros).

¡Hola! ¿Qué tal? ¡Bienvenidos! Continuamos con el curso de Laravel.

¡Empecemos!

Factories en Laravel

Los Factories son una alternativa para poblar datos de manera automatizada, generando una cantidad significativa de información de manera aleatoria. Su uso es sencillo; solo se necesita especificar el tipo de dato para cada campo de la tabla y la cantidad deseada de registros a generar.

Los datos generados por los Factories no siempre reflejan con precisión cada campo de una tabla, y es importante tener en cuenta que estos datos suelen estar en inglés. Por ejemplo, nombres, apellidos, ciudades, direcciones, entre otros, son generados de manera aleatoria y pueden no corresponder a datos reales o locales.

Desplegar tu proyecto Laravel a producción

Adquiere la guía en formato PDF

Crear los Factory

Para generar y ejecutar Factories en Laravel, utilizaremos Artisan desde la Terminal. En primer lugar, creamos nuestra clase ‘ProfesorFactory’ para llenar datos en la tabla “profesores” de la siguiente manera:

php artisan make:factory ProfesorFactory

Este comando generará una clase llamada “ProfesorFactory” en el directorio “database/factories”. Al explorar la clase, observamos que contiene un método llamado “definition”, el cual devuelve un array vacío. Es en este método donde iremos registrando los datos aleatorios para la tabla “profesores”.

'nombre_apellido' => $this->faker->firstName() . ' ' . $this->faker->lastName(),
'profesion' => $this->faker->randomElement(['Ing. Sistema', 'Ing. Electronico', 'Adm. Empresas', 'Ing. Comercial']),
'grado_academico' => $this->faker->randomElement(['Licenciatura', 'Master', 'Tecnico']),
'telefono' => $this->faker->phoneNumber()

Ahora, para poder utilizar la clase “ProfesorFactory”, vamos a utilizar la clase Seeder principal “DatabaseSeeder”, siguiendo un proceso similar al que se utiliza para invocar los seeders. En primer lugar, realizamos la referencia al modelo “Profesor”.

use App\Models\Profesor;

Invocamos el Factory especificando la cantidad de registros que deseamos crear en la tabla “profesores”.

Profesor::factory(10)->create();

Seguidamente, de manera similar procedemos a crear el factory para la tabla “Alumnos”, desde Artisan ejecutamos el siguiente comando.

php artisan make:factory AlumnoFactory

Ahora vamos a agregar campos y valores predeterminados según tus necesidades de la tabla “alumnos”.

'nombre_apellido' => $this->faker->firstName() . ' ' . $this->faker->lastName(),
'edad' => $this->faker->randomElement([18, 19, 20, 21]),
'telefono' => $this->faker->phoneNumber(),
'direccion' => $this->faker->address()

En la clase Seeder principal “DatabaseSeeder”, realizamos la referencia al modelo “Alumno”.

use App\Models\Alumno;

Invocamos la clase “AlumnoFactory” especificando la cantidad de registros que deseamos crear en la tabla “alumnos”.

Alumno::factory(10)->create();

Por último, vamos a crear el Seeder para la tabla “cursos”, como en los Seeders hay que prestarle atención a esta clase por las relaciones que tiene con las tablas “profesores” y “alumnos” de la base de datos. Crearemos la clase “CursoFactory”.

php artisan make:factory CursoFactory

Igual que en los anteriores Factories llenamos los campos de la tabla cursos, La diferencia en este caso reside en la relación que se establece entre la tabla “cursos” y la tabla “profesores”

Al momento de referenciar el campo “profesor_id”,  vamos a invocar al modelo “Profesor”.

use App\Models\Profesor;

Seguidamente, vamos a llenar los campos incluyendo “profesor_id”, seleccionar aleatoriamente un identificador “id” de profesor.

'materia' => $this->faker->word(),
'nivel' => $this->faker->randomElement(['1r nivel', '2do nivel', '3r nivel', '4to nivel', '5to nivel']),
'horas_academicas' => $this->faker->randomElement(['10 Horas', '40 Horas', '80 Horas']),
'profesor_id' => Profesor::all()->random()->id

En la clase Seeder principal “DatabaseSeeder”, realizamos la referencia al modelo “Curso”.

use App\Models\Curso;

Invocamos la clase “CursoFactory” especificando la cantidad de registros que deseamos crear en la tabla “alumnos”.

Curso::factory(5)->create();

Ejecutar los Factories

Finalmente, ejecutamos las migraciones y los seeders desde Artisan para poblar nuestra base de datos con las modificaciones realizadas. Iniciamos reiniciando las migraciones mediante el comando «fresh».

php artisan migrate:fresh

Por último, ejecutamos los seeders.

php artisan db:seed

Si revisamos las tablas de nuestra base de datos, podemos constatar que la información se cargó exitosamente en las tablas “profesores”, “alumnos” y “cursos”, pero NO en la tabla pivot “alumno_curso”, que representa la relación muchos a muchos entre las tablas “alumnos” y “cursos”.

Para solucionar este problema, debemos realizar la referencia a la tabla pivot desde la clase principal “DatabaseSeeder”, utilizaremos el método “has” para la referencia entre las tablas “alumnos” y “cursos”. reemplazamos las factories “Alumno::factory(10)->create();” y “Curso::factory(5)->create();” por lo siguiente:

Curso::factory()->has(Alumno::factory()->count(5))->create();
Curso::factory()->has(Alumno::factory()->count(5))->create();
Curso::factory()->has(Alumno::factory()->count(3))->create();

Nuevamente ejecutamos los seeder y podemos observar que ahora se cargaron los datos en todas las tablas incluyendo la tabla pivot con sus relaciones.

Conclusión

Tanto los Seeders y Factories en Laravel son funcionalidades muy importantes, facilitan nuestro trabajo a la hora de construir nuestra aplicación y realizar las pruebas de ciertas partes del código. En la siguiente clase veremos la interfaz de línea de comandos de Laravel Artisan.

Recuerda que puedes descargar el código fuente de esta clase y todas las demás  clases en el repositorio de GitHub totalmente gratis.

Saludos cordiales.

Victor Peña

Victor Peña

Desarrollador de software Backend Developer, experto en Laravel Framework, PHP, JavaScript y MySQL. Creador de contenidos de emprendimiento y desarrollo de software.

1 comentario en “Factories en Laravel”

  1. Pingback: Seeders en Laravel - Norvic Software

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *