Problema con migraciones en Laravel

Publicado por Lynn
hace 2 semanas

¡Hola a todos!

Estoy teniendo un problema al realizar migraciones en Laravel. He creado una migración para una tabla mixta (polymorphic relationship) llamada "Comentarios" que se puede asociar a diferentes modelos.

El código de mi migración es el siguiente:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateComentariosTable extends Migration
{
    public function up()
    {
        Schema::create('comentarios', function (Blueprint $table) {
            $table->increments('id');
            $table->text('texto');

            $table->unsignedInteger('comentarioable_id');
            $table->string('comentarioable_type');

            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('comentarios');
    }
}

El problema ocurre cuando intento ejecutar la migración utilizando el comando php artisan migrate. Recibo el siguiente error:

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `comentarios` add constraint `comentarios_comentarioable_id_comentarioable_type_foreign` foreign key (`comentarioable_id`, `comentarioable_type`) references `modelos` (`id`, `type`))

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

¿Alguien sabe cómo puedo solucionar este problema?

¡Muchas gracias de antemano!

Respuesta de Gordon Shumway
hace 2 semanas

¡Hola Lynn!

El error que estás obteniendo indica que hay un problema al intentar añadir una restricción de clave foránea. Sin embargo, en el código de migración que has compartido, no veo que estés intentando añadir ninguna clave foránea explícitamente. En una relación polimórfica, no es posible crear una clave foránea estándar, ya que el comentarioable_id y comentarioable_type podrían referirse a distintas tablas.

Sin embargo, parece que Laravel está intentando crear una clave foránea que no has definido. Esto puede ocurrir si estás utilizando una versión de Laravel que automáticamente infiere las claves foráneas o si tienes algún código en otra parte de tu migración o modelo que intenta definir esta clave foránea. Para resolver este problema, primero asegúrate de que no estás definiendo claves foráneas para esas columnas en ninguna parte de tus migraciones o modelos.

Además, aquí tienes algunas recomendaciones:

  1. Verifica si en otro archivo de migraciones o en los modelos estás definiendo algún tipo de relación que intenta crear la clave foránea implicitamente.

  2. Asegúrate de que las versiones de laravel que estás usando, no intente crear automáticamnete claves foráneas basadas en el naming de las columnas. Si es así, puedes intentar desactivar esta característica o cambiar el nombre de las columnas para que no coincidan con el patrón que Laravel usa para inferir las relaciones.

  3. Confirma que no haya ningún otro error anterior en la migración que podría haber causado que no se ejecutara correctamente. A veces, un error previo puede causar que los mensajes de error se muestren de una manera confusa.

La relación polimórfica en sí está configurada correctamente y no debería necesitar una definición de clave foránea tradicional. Si después de la revisión de lo anterior el problema persiste, puede ser útil compartir más contextos o verificar el código de tu modelo para ver si hay algo que esté causando este comportamiento.

¡Espero que consigas solucionarlo pronto!