> Faqs > Solucionar "Cannot drop index" en migración Laravel

Solucionar "Cannot drop index" en migración Laravel

Hola!

Tengo una migración en Laravel que quiero deshacer mediante el rollback sobre la migración, pero me sale un error:

SQLSTATE[HY000]: General error: 1553 Cannot drop index 'payment_user_id_foreign': needed in a foreign key constraint (SQL: alter table `payment` drop `user_id`)

¿Cómo debo hacer para que esta columna de la relaciónn se pueda eliminar correctamente?

Este es el código de la migración:

class CreateUserColumn extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('payment', function (Blueprint $table) {
            $table->unsignedInteger('user_id')->nullable();
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('payment', function (Blueprint $table) {
            $table->dropColumn('user_id');
        });
    }
}

La migración la intento deshacer con el comando de rollback siguiente:

php artisan migrate:rollback --step=1

Respuestas

Lo que está pasando en esta migración es que no estás eliminando el index creado al hacerla.

Dada esta línea de tu migración:

$table->foreign('user_id')->references('id')->on('users');

Quiere decir que se está creando un índice en la base de datos a la clave primaria user_id. Si eliminas más tarde la columna user_id tendrías que eliminar el índice.

La solución consiste simplemente en hacer el dropForeign antes de eliminar el "user_id" con dropColumn.

public function down()
{
    Schema::table('payments', function (Blueprint $table) {
        $table->dropForeign('payments_user_id_foreign');
        $table->dropColumn('user_id');
    });
}

Solo tienes que asegurarte del nombre del índice que se ha generado, que siempre combina el nombre de la tabla y el campo de la relación, con la palabra foreign. Luego te dejará hacer el dropColumn al volver atrás la migración.

Julian
1100 46 84 45