Я создал таблицу с использованием миграции следующим образом:
public function up() { Schema::create('despatch_discrepancies', function($table) { $table->increments('id')->unsigned(); $table->integer('pick_id')->unsigned(); $table->foreign('pick_id')->references('id')->on('picks'); $table->integer('pick_detail_id')->unsigned(); $table->foreign('pick_detail_id')->references('id')->on('pick_details'); $table->integer('original_qty')->unsigned(); $table->integer('shipped_qty')->unsigned(); }); } public function down() { Schema::drop('despatch_discrepancies'); } 
  Мне нужно изменить эту таблицу и удалить ссылку на внешний ключ и столбец pick_detail_id и добавить новый столбец varchar, называемый sku после столбца pick_id . 
Итак, я создал другую миграцию, которая выглядит так:
 public function up() { Schema::table('despatch_discrepancies', function($table) { $table->dropForeign('pick_detail_id'); $table->dropColumn('pick_detail_id'); $table->string('sku', 20)->after('pick_id'); }); } public function down() { Schema::table('despatch_discrepancies', function($table) { $table->integer('pick_detail_id')->unsigned(); $table->foreign('pick_detail_id')->references('id')->on('pick_details'); $table->dropColumn('sku'); }); } 
Когда я запускаю эту миграцию, я получаю следующую ошибку:
[Осветите \ Database \ QueryException]
SQLSTATE [HY000]: Общая ошибка: 1025 Ошибка при переименовании './dev_iwms_reboot/despatch_discrepancies' в './dev_iwms_reboot/#sql2-67c-17c464' (errno: 152) (SQL: alter table despatch_discrepancies удаляет внешний ключ pick_detail_id)[PDOException]
SQLSTATE [HY000]: Общая ошибка: 1025 Ошибка при переименовании './dev_iwms_reboot/despatch_discrepancies' в './dev_iwms_reboot/#sql2-67c-17c464' (errno: 152)
  Когда я пытаюсь отменить эту миграцию, выполнив команду php artisan migrate:rollback , я получаю сообщение Rolled back , но на самом деле ничего не делает в базе данных. 
Любая идея, что может быть неправильным? Как вы удаляете столбец с ссылкой на внешний ключ?
Вы можете использовать это:
 $table->dropForeign(['pick_detail_id']); $table->dropColumn('pick_detail_id'); 
Если вы возьмете пик в источнике dropForeign, он построит для вас имя индекса внешнего ключа, если вы передадите имя столбца в виде массива.
Оказывается; когда вы создаете внешний ключ следующим образом:
 $table->integer('pick_detail_id')->unsigned(); $table->foreign('pick_detail_id')->references('id')->on('pick_details'); 
Laravel однозначно называет ссылку на внешний ключ следующим образом:
 <table_name>_<foreign_table_name>_<column_name>_foreign despatch_discrepancies_pick_detail_id_foreign (in my case) 
Поэтому, когда вы хотите удалить столбец с ссылкой на внешний ключ, вы должны сделать это следующим образом:
 $table->dropForeign('despatch_discrepancies_pick_detail_id_foreign'); $table->dropColumn('pick_detail_id'); 
Laravel 4.2+ представляет новое соглашение об именах:
 <table_name>_<column_name>_foreign 
Ключ (для меня) к решению этого заключался в том, чтобы удостовериться, что команде $ table-> dropForeign () передано правильное имя отношения, не обязательно имя столбца. Вы не хотите передавать имя столбца, как было бы намного более интуитивно имхо.
Что для меня работало:
 $table->dropForeign('local_table_foreign_id_foreign'); $table->column('foreign_id'); 
Итак, строка, которую я передал dropForeign (), которая работала для меня, была в формате:
[локальная таблица] _ [поле внешнего ключа] _foreign
Если у вас есть доступ к инструменту, например, Sequel Pro или Navicat, возможность визуализации данных будет очень полезна.
Передайте массив с именем col
 $table->dropForeign(['user_id']); 
  Что-то, что пришло мне в голову, было то, что я не знал, куда положить блок Schema::table . 
Позже я обнаружил, что ключ находится на ошибке SQL:
 [Illuminate\Database\QueryException] SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `lu_benefits_categories`) 
  Поэтому блок Schema::table должен перейти в функцию down() миграции lu_benefits_categories и до строки Schema::dropIfExists : 
 public function down() { Schema::table('table', function (Blueprint $table) { $table->dropForeign('table_category_id_foreign'); $table->dropColumn('category_id'); }); Schema::dropIfExists('lu_benefits_categories'); } 
  После этого php artisan migrate:refresh или php artisan migrate:reset сделает трюк.