Отбрасывание внешнего ключа без знака в laravel.Синтаксическая ошибка или нарушение доступа: 1091 Can't DROP;проверьте, что столбец / ключ существует - PullRequest
1 голос
/ 22 сентября 2019

Я создал миграцию, используя следующую

Schema::table('packages', function (Blueprint $table) {
     $table->integer('star_id')->unsigned()->index()->nullable()->default(null);
     $table->foreign('star_id')->references('id')->on('star');
});

в отбрасываемой части

Schema::table('packages', function (Blueprint $table) {
      $table->dropForeign('star_id');
      //$table->dropIndex('star_id'); //also tried dropIndex
      $table->dropColumn('star_id');
 });

, но он выбрасывает для индекса и внешнего

SQLSTATE [HY000]: Общая ошибка: 1553 Невозможно удалить индекс 'packages_star_id_index': необходимо в ограничении внешнего ключа (SQL: изменить таблицу packages drop star_id)

ошибка для dropForeign

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1091 Can't DROP 'star_id';проверьте наличие столбца / ключа (SQL: изменить таблицу packages удалить внешний ключ star_id)

Я не могу выполнить откат из-за ошибки.

1 Ответ

1 голос
/ 23 сентября 2019

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

См. здесь :

Если данный «индекс» на самом деле является массивом столбцов, разработчик хочет удалить индекс, просто указав задействованные столбцы без обычного имени, поэтому мы будем строить имя индекса из столбцов.

// laravel assumes star_id is the foreign key name
$table->dropForeign('star_id'); 

// laravel builds the foreign key name itself e.g. packages_star_id_foreign
$table->dropForeign(['star_id']);

Так что в вашем случае просто передайте столбец в массиве:

Schema::table('packages', function (Blueprint $table) {
    $table->dropForeign(['star_id']);
    $table->dropColumn('star_id');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...