2014-10-29 65 views
3

我的外键涉及其自己的表。这是为了生成帖子,其层级为问题与丢弃外键

现在,当我尝试在数据库中删除列,它给了我这个错误:

1553 - Cannot drop index 'post_field_properties_parent_id_index': needed in a foreign key constraint 

这是代码:

public function down() 
{ 
     Schema::table("post_field_properties", function($table) 
     { 
      $table->dropForeign('parent_id'); 
      $table->dropColumn('parent_id'); 
     }); 
} 

我似乎能的唯一途径做到这一点,是要转到phpmyadmin并删除外键本身。然后删除列。

+0

哪些表名,你通过外键连接了吗? – 2014-10-29 10:44:43

+1

“parent_id”是否真的是外键的名字?通常情况下,就像[这里]显示的一样(http://laravel.com/docs/4.2/schema#foreign-keys) – lukasgeiter 2014-10-29 10:49:04

回答

1

尝试将“_foreign”放在列名的末尾。例如:

public function down() 
{ 
     Schema::table("post_field_properties", function($table) 
     { 
      $table->dropForeign('parent_id_foreign'); 
      $table->dropColumn('parent_id'); 
     }); 
} 
+0

谢谢我会试试这个 – Jimmyt1988 2014-10-29 11:28:59

9

刚刚为我自己的项目弄明白了这一点。当你删除一个外键,你需要连接的表名和约束中的列然后用后缀名“_foreign”

http://laravel.com/docs/5.1/migrations#foreign-key-constraints

public function down() 
{ 
     Schema::table("post_field_properties", function($table) 
     { 
      $table->dropForeign('post_field_properties_parent_id_foreign'); 
      $table->dropColumn('parent_id'); 
     }); 
} 
+1

Works也在5.2 :)非常有帮助谢谢! – 2016-02-21 06:35:37

+1

在5.3中工作!谢谢。 – Notflip 2017-02-07 08:11:50

+0

(可选)您可以通过将数组传递给dropForeign方法来指定要删除的外键的列名: '$ table-> dropForeign(['parent_id']);' 删除外键非常重要在删除相关列之前关键。 – 2017-05-24 10:35:22

0

要检查外键的名称,第一次备份您的数据库.SQL

在那里你会看到你的外键的名称是这样的:

... 
KEY `employees_parent_id_foreign` (`parent_id`), 
CONSTRAINT `employees_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `laravel_article` (`id`) ON DELETE CASCADE 
... 
在我的CAS

e是laravel 5.4, 它通过这种格式开始:tablename_columnname_foreign

所以在您的laravel(在这里,我尝试删除从员工表的外键)

Schema::table("employees", function($table) 
{ 
    $table->dropForeign('employees_parent_id_foreign'); 
    $table->dropColumn('parent_id'); 
});