Entonces uso mi proyecto localmente y ejecuto este código php artisan migrate todo funciona perfectamente bien y se crearán mis tablas

Pero cuando me muevo a mi vps y hago lo mismo me sale este error

[Iluminar \ Base de datos \ Excepción de consulta] SQLSTATE [HY000]: Error general: 1215 No se puede agregar la restricción de clave externa (SQL : alterar tabla mediables agregar restricción mediables_media_id_foreign forei la tecla gn (media_id) hace referencia a media (id) en la cascada de eliminación)

Seguí alguna solución de este sitio pero no funcionaron

Mi archivo de migración:

 Schema::create('media', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->nullable();
        $table->string('old_name')->nullable();
        $table->text('desc')->nullable();
        $table->string('category')->nullable();
        $table->string('type');
        $table->string('format');
        $table->string('href');
        $table->string('thumbnail')->nullable();

        $table->timestamps();
    });

    Schema::create('mediables', function (Blueprint $table) {

        $table->integer('media_id')->nullable();
        $table->integer('mediable_id');
        $table->string('mediable_type');
        $table->primary(['media_id','mediable_id','mediable_type']);

        $table->timestamps();
    });
    Schema::table('mediables', function (Blueprint $table) {
        $table->foreign('media_id')
            ->references('id')->on('media')
            ->onDelete('cascade');
    });

Tenga en cuenta que hay una relación polimórfica entre los medios y otros modelos en mi proyecto

La única diferencia entre mi máquina local y mi vps es que tengo apache localmente y nginx en vps si está relacionado

4
Mohammad Reza 26 dic. 2016 a las 11:20

3 respuestas

La mejor respuesta

La tabla media debe tener una columna id, porque media_id hace referencia a ella.

Además, si id es increment(), debe usar la clave externa unsigned():

$table->integer('media_id')->unsigned()->nullable();
2
Alexey Mezenin 26 dic. 2016 a las 08:52

Debe establecer el motor de tabla en InnoDB de forma predeterminada o establecerlo explícitamente con

$table->engine = 'InnoDB';

Solo el motor InnoDB maneja las restricciones de clave externa.

1
Aatish Sai 26 dic. 2016 a las 09:32

Si está utilizando un nuevo WAMP, cuide su mysql, ya que por defecto aceptará cualquier relación incluso entre columnas no existentes como

$table->foreign('media_id')
        ->references('id')->on('media')
        ->onDelete('cascade');

id no existe en la tabla media.

Además, $table->primary(['media_id','mediable_id','mediable_type']); no se ejecutará, ya que ha configurado un id primario, ya que $table->increments('id'); establecerá id como primario.

1
M.Elwan 26 dic. 2016 a las 09:02