2014-11-08 71 views
19

我user_ID的FK列在我的表添加 “ON DELETE CASCADE” 到现有列在Laravel

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

我要补充在级联删除功能,这个现有列。我怎样才能做到这一点?

+0

使用原始查询'DB :: statement('..')'。你的桌子的名字是什么? – Razor 2014-11-08 23:23:00

+0

表的名称是“答案” – 2014-11-08 23:24:44

回答

37

我们应该先放弃外键。感谢Razor这个提示

$table->dropForeign('answers_user_id_foreign'); 
$table->foreign('user_id') 
->references('id')->on('users') 
->onDelete('cascade'); 
+0

这是在新迁移中完成的吗? – 2015-05-21 14:45:33

+1

@BrentConnor如果它已经被迁移并投入生产,那么是的。否则,您可以回滚迁移,编辑原始文件,然后再次迁移。 – Marcel 2015-09-10 22:32:02

1
$table->foreign('user_id') 
     ->references('id')->on('users') 
     ->onDelete('cascade'); 
+0

[Illuminate \ Database \ QueryException] SQLSTATE [HY000]:General error:1005无法创建表'xxx。#sql-5d7_226'(errno:121)(SQL:alter table 'xxx'添加约束answers_user_id_foreign外键('user_id ')在删除级联时引用'users'('id') – 2014-11-08 23:16:33

+1

对现有列不起作用 – 2014-11-08 23:20:25

+1

那么也许你应该报告它是一个bug,因为那是官方[记录的方法](http://laravel.com/docs/4.2/schema#foreign-keys) – 2014-11-09 00:09:06

3

Laravel架构构建不能在当前状态下修改列,所以你会使用原始查询。你将不得不删除并重新创建约束

PostgreSQL的

function up() 
{ 
    DB::statement('alter table answers drop constraint answers_user_id_foreign, 
        add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id) 
        on delete cascade;' 
    ); 
} 
function down() 
{ 
    DB::statement('alter table answers drop constraint answers_user_id_foreign, 
        add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id);' 
    ); 
} 

MySQL的

function up() 
{ 
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;'); 
    DB::statement('alter table answers add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id) 
        on delete cascade;' 
    ); 
} 
function down() 
{ 
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;'); 
    DB::statement('alter table answers add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id);' 
    ); 
} 
0
$table->integer('user_id')->unsigned();  
$table->foreign('user_id') 
     ->references('id')->on('users') 
     ->onDelete('cascade'); 

我假设你使用Illuminate\Database\Schema\Blueprint::primary()创建users.id。如果是这种情况,则users.id将被无符号。因此,您的外键列user_id也必须是未签名的。

2

感谢您的回答。帮助我在L5.1中获得这个工作代码:

public function up() 
{ 
    Schema::table('transactions', function (Blueprint $table) { 
     $table->dropForeign('transactions_order_id_foreign'); 
     $table->foreign('order_id') 
      ->references('id')->on('orders') 
      ->onDelete('cascade') 
      ->change(); 
    }); 

    Schema::table('orders', function (Blueprint $table) { 
     $table->dropForeign('orders_user_id_foreign'); 
     $table->foreign('user_id') 
      ->references('id')->on('users') 
      ->onDelete('cascade') 
      ->change(); 
    }); 
}