Contenido del curso

Factories y seeders para poblar tu API en Laravel

Resumen

Si trabajas con Laravel y necesitas datos realistas para probar tu API, los factories y seeders son la forma más rápida de generar registros falsos que imiten el mundo real. Aquí verás cómo crear esa estructura inicial de datos para categorías, recetas, etiquetas y usuarios, incluyendo la relación muchos a muchos. Es ideal para quien ya configuró sus migraciones y quiere practicar con consultas reales.

¿Qué es un factory en Laravel y para qué sirve?

Un factory define la estructura inicial de los datos que poblarán tus tablas. Mientras la migración crea la tabla, el factory se encarga de inventar registros aleatorios pero con apariencia realista.

En el factory de categorías, el campo nombre se genera con la función fake()->word() y se envuelve en una función que convierte la primera letra en mayúscula. En el factory de etiquetas se usa la misma palabra aleatoria, pero sin capitalizar: las etiquetas viven en minúscula [02:05].

¿Qué hace fake() en un factory? Genera datos falsos como nombres, oraciones, URLs o párrafos. Sirve para llenar tablas con registros que parezcan reales sin escribirlos a mano.

¿Cómo se arma el factory de recetas?

El factory de recetas necesita todos los campos definidos en su migración: categoría, usuario, título, descripción, ingredientes, instrucción e imagen. La estructura usa un array asociativo con la sintaxis 'campo' => valor.

  • category_id: consulta todas las categorías, toma una aleatoria con inRandomOrder()->first() y devuelve su ID.
  • user_id: misma lógica aplicada al modelo User.
  • title: fake()->sentence() para una oración corta.
  • description, ingredients, instruction: fake()->text() para bloques más largos.
  • image: fake()->imageUrl(640, 480) para una URL de imagen ficticia de 640x480 [04:30].

Esta lógica garantiza que cada receta quede asociada a una categoría y a un usuario existentes, manteniendo la integridad referencial.

¿Cómo conectar Laravel a la base de datos antes de sembrar?

La conexión vive en el archivo .env. Allí defines host, usuario, contraseña y nombre de la base. En el ejemplo se usa localhost, usuario italomoralesf, contraseña root y base laravel_api [06:10].

La base se crea desde el cliente que prefieras, en este caso PHPMyAdmin. La base queda vacía: las tablas nacerán de las migraciones y los datos de los factories.

¿Por qué la contraseña por defecto del UserFactory de Laravel es password? Porque el factory ya trae una cadena encriptada que equivale a la palabra password. Cuando inicies sesión con un usuario generado, esa es la contraseña en texto plano.

¿Cómo se configuran los seeders y la relación muchos a muchos?

El seeder es quien llama al factory y decide cuántos registros crear. Para este proyecto la receta es la siguiente:

  • 1 usuario fijo con email i@admin.com.
  • 29 usuarios aleatorios adicionales.
  • 12 categorías.
  • 100 recetas.
  • 40 etiquetas.

Después de poblar las tablas principales viene la parte interesante: la relación muchos a muchos entre recetas y etiquetas. Se hace un foreach sobre todas las recetas, y a cada una se le asignan entre 2 y 4 etiquetas aleatorias usando tags->random(rand(2,4)) y luego attach() desde el método etiquetas() del modelo Receta [09:40].

¿Cómo declarar la relación belongsToMany en el modelo?

La relación existe en la base de datos a través de una tabla pivote, pero Laravel necesita que la declares en el modelo. En Receta.php se agrega un método en plural que retorne belongsToMany(Etiqueta::class). Sin esto, el seeder lanza un error al intentar usar attach.

Un detalle importante: si escribes mal el nombre del método (por ejemplo belongsToMan), las tablas se crean pero el seeder falla en la relación. La solución es eliminar todo, corregir el modelo y volver a ejecutar el comando.

¿Qué comando ejecuta migraciones y seeders al mismo tiempo?

El comando que une todo es:

bash php artisan migrate:fresh --seed

Este comando borra las tablas existentes, vuelve a crearlas desde las migraciones y ejecuta los seeders para llenarlas con datos falsos. Al terminar deberías ver 12 categorías, 100 recetas, 40 etiquetas y alrededor de 310 relaciones en la tabla pivote [12:50].

Desde el diseñador de PHPMyAdmin se confirma el modelo:

  • Una categoría tiene muchas recetas.
  • Un usuario tiene muchas recetas.
  • Una receta pertenece a muchas etiquetas y viceversa.

Con esta estructura ya puedes practicar consultas reales sobre tu API. ¿Qué tipo de consulta vas a hacer primero, filtrar recetas por categoría o listar etiquetas con su conteo de recetas? Cuéntame en los comentarios.