【问题标题】:Laravel adding cascade on delete to an existing tableLaravel 在删除时添加级联到现有表
【发布时间】:2020-06-05 17:08:16
【问题描述】:

在我的 laravel 应用程序中,我有一个名为 researces 的表和另一个名为 paper 的表。它们具有一对多的关系,每个研究可以有一篇或多篇论文。在论文迁移文件中,我使用以下方法创建了外键约束:

        //foreign key for the research model
        $table->unsignedBigInteger('research_id');
        $table->index('researach_id');

现在我想创建一个新的迁移以添加级联 onDelete,以便在删除其父研究时删除论文。我该怎么做?我正在使用 laravel 5.1

编辑

所以答案与接受的答案非常相似,除了我必须先删除列然后添加外键。因为我还没有投入生产,所以删除列不是问题,但如果你在生产环境中,你最终可能会弄乱数据库中数据的一致性。所以要小心

【问题讨论】:

    标签: laravel foreign-keys migration cascading-deletes


    【解决方案1】:

    先删除外键再添加

    $table->dropIndex('researach_id');
    $table->foreign('research_id')
    ->references('id')->on('researches')
    ->onDelete('cascade');
    

    参考: Laravel -> Database: Migrations -> Foreign Key Constraints

    【讨论】:

    • 谢谢。问题是当我尝试删除它时出现语法错误或访问冲突:1091 Can't DROP FOREIGN KEY research_id;检查它是否存在(SQL:alter table files drop foreign key research_id)
    • 谢谢。现在我收到此错误 1091 Can't DROP FOREIGN KEY paper_research_id_index;检查它是否存在(SQL:alter table files drop foreign key research_id)
    • 我不能简单地做 $table->dropcolumn('research_id'); 吗?
    • 是的,您可以这样做,但您必须再次创建该列
    • 您收到此错误是因为您没有创建外键索引。您刚刚使用 $table->index('researach_id'); 创建了一个普通索引;
    【解决方案2】:

    创建一个新的迁移并添加必要的外键约束以及在修改/删除外键数据时要执行的操作。

    $table->foreign('research_id')
          ->references('id')->on('researches')
          ->onDelete('cascade');
    

    可以在here找到文档。

    【讨论】:

    • 所以这意味着我必须先删除此列,然后按您写的添加它?我试图这样做但得到了这个:语法错误或访问冲突:1091 Can't DROP FOREIGN KEY research_id;检查它是否存在(SQL:alter table papers drop foreign key research_id
    • 是的,如果之前设置了外键约束,您确实需要删除该列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2013-06-19
    • 2015-10-06
    • 2012-12-04
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多