Падение уникального индекса Laravel 5

Я продолжал получать это во время выполнения php artisan migrate

SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1091 Невозможно DROP 'email'; убедитесь, что существует столбец/ключ

Пока я вижу, что письмо существует в моей базе данных.

введите описание изображения здесь


Моя миграция script. Я пытался удалить уникальное ограничение.

<?php

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

class AlterGuestsTable3 extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('guests', function(Blueprint $table)
        {
            $table->dropUnique('email');

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('guests', function(Blueprint $table)
        {

            $table->dropUnique('email');

        });
    }

}

Я забыл очистить все кеши?

Любые подсказки для меня?

Ответ 1

При отбрасывании индексов Laravel ожидает, что будет указано полное имя индекса.

Вы можете проверить свою базу данных на полное имя индекса, но если ключ был сгенерирован предыдущей миграцией Laravel, его имя должно соответствовать единому, простому соглашению об именах.

Вот что документация должна сказать о своем соглашении об именах (начиная с версии 5.2):

По умолчанию Laravel автоматически назначает разумное имя индексам. Просто соедините имя таблицы, имя проиндексированного столбца и тип индекса.

Мое предположение - вот почему вы получаете ошибку. Нет индекса email, но, вероятно, есть индекс guests_email_unique.

Дайте этой миграции выстрел:

<?php

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

class AlterGuestsTable3 extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('guests', function(Blueprint $table)
        {
            $table->dropUnique('guests_email_unique');

        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('guests', function(Blueprint $table)
        {
            //Put the index back when the migration is rolled back
            $table->unique('email');

        });
    }

}

Я понимаю, что немного запутано, что при создании индекса вы указываете имена столбцов, но при отбрасывании индекса позже вам нужно указать полное имя индекса.

Обратите внимание, что я также скорректировал метод down(), чтобы он возвращал уникальный индекс, добавляя его обратно.

Ответ 2

официальная документация Вы можете увидеть следующее:

Если вы передаете массив столбцов в метод, который снижает индексы, условное имя индекса будет генерироваться на основе имени таблицы, столбцы и тип ключа:

Schema::table('geo', function ($table) {
    $table->dropIndex(['state']); // Drops index 'geo_state_index' 
});



Вы можете просто удалить его с помощью [] вокруг имени поля:

Schema::table('guests', function(Blueprint $table)
{
    $table->dropUnique(['email']);
});