Contenido del curso

Respuestas anidadas y migrate fresh en Laravel

Resumen

Configurar el modelo de respuestas en Laravel implica algo más que crear una tabla: necesitas relacionarla con preguntas, usuarios y consigo misma para soportar respuestas anidadas. Aquí ves cómo dejar lista esa estructura usando migrations, factories y seeders, además del comando que te salva cuando una migración falla.

¿Cómo se crea el modelo de respuestas con migración y factory?

El primer paso es generar el modelo junto con sus archivos auxiliares en una sola línea de comando. En el terminal ejecutas el Artisan correspondiente para crear la entidad de respuestas con migración y factory incluidos [00:32].

bash php artisan make:model Answer -mf

Este comando te ahorra crear cada archivo por separado y deja el esqueleto listo para configurar la tabla.

¿Qué relaciones necesita la tabla answers?

La estructura de respuestas se parece a la de preguntas porque comparte varias foreign keys, así que puedes copiar esa migración como base y ajustarla [00:50]. La tabla necesita tres relaciones claras.

  • Una respuesta pertenece a sí misma, lo que permite respuestas hijas conectadas a una respuesta padre mediante un self-referencing foreign key.
  • Una respuesta pertenece a un usuario, y si eliminas al usuario la respuesta también se elimina con cascade.
  • Una respuesta pertenece a una pregunta, con la misma regla de eliminación en cascada.

La diferencia clave está en la relación consigo misma: cuando borras una respuesta padre no quieres perder a sus hijas, sino que el campo de referencia pase a null y esas respuestas se conviertan automáticamente en principales [01:30].

¿Qué hace onDelete set null en una migración de Laravel? Convierte el valor de la foreign key en null cuando el registro padre se elimina, en lugar de borrar el registro hijo. Sirve para conservar datos relacionados sin dejar referencias rotas.

Para que esto funcione, el campo que guarda la referencia al padre debe permitir valores nulos. Si olvidas marcarlo como nullable, Laravel lanzará un error indicando que la columna no admite null [03:20].

¿Qué campos guarda la respuesta además de las relaciones?

A diferencia de las preguntas, una respuesta no necesita título. Lo único que importa es el contenido, así que la migración solo conserva el campo body con el texto de la respuesta [02:35].

¿Cómo configurar el factory y el seeder de respuestas?

El factory genera datos falsos para poblar la base de datos durante el desarrollo. Para respuestas, necesitas tres definiciones [02:50]:

  1. Asociar cada respuesta a una de las 200 preguntas existentes.
  2. Asociarla a uno de los 10 usuarios creados previamente.
  3. Generar un body con texto aleatorio usando Faker.

Luego, en el seeder principal indicas que se creen 400 respuestas al ejecutar el proceso de poblamiento [03:10].

¿Para qué sirve un factory en Laravel? Define la estructura de datos falsos que se usarán al poblar la base de datos. Lo combinas con un seeder para crear cientos de registros de prueba en segundos.

¿Cuál es la diferencia entre migrate refresh y migrate fresh?

Al ejecutar las migraciones aparecen dos errores típicos que te enseñan cuándo usar cada comando [03:40].

  • php artisan migrate:refresh ejecuta un rollback de las migraciones existentes y vuelve a correrlas. Si una tabla quedó en estado inconsistente, el rollback puede fallar.
  • php artisan migrate:fresh elimina todas las tablas y las crea desde cero, ignorando cualquier estado previo. Es la opción cuando un error anterior bloquea el flujo normal.

¿Cuándo uso migrate fresh en lugar de refresh? Cuando una migración falló a medias y dejó tablas corruptas o duplicadas. fresh borra todo y reconstruye, evitando arrastrar errores.

El resultado final del proceso es una base de datos con 10 categorías, 10 usuarios, 200 preguntas y 400 respuestas, todo listo para que el diseño del proyecto pueda mostrar el número real de respuestas por pregunta en lugar de un texto estático [04:30].

¿Qué aprendiste al configurar la entidad de respuestas?

Más allá de la tabla, te llevas tres habilidades concretas: modelar relaciones self-referencing con nullable y onDelete('set null'), encadenar factories a registros existentes con identificadores aleatorios, y diferenciar migrate:fresh de migrate:refresh para resolver bloqueos en desarrollo. Cuéntame en los comentarios qué otras relaciones complejas has tenido que modelar en tus proyectos.