Laravel:即使使用“dropForeign”方法也不能删除外键

Posted

技术标签:

【中文标题】Laravel:即使使用“dropForeign”方法也不能删除外键【英文标题】:Laravel:Can't drop foreign key even using 'dropForeign' method 【发布时间】:2017-10-31 10:23:57 【问题描述】:

我即将刷新我的迁移。但是php artisan migrate:refresh 命令不起作用。 它显示以下错误:

[Illuminate\Database\QueryException] SQLSTATE[42000]:语法错误 或访问冲突:1091 Can't DROP 'classes_userid_foreign';查看 该列/键存在(SQL:alter table classes drop foreign key classes_userid_foreign)

[PDOException] SQLSTATE[42000]:语法错误或访问冲突: 1091 不能 DROP 'classes_userid_foreign';检查该列/键 存在

我什至使用了dropForeign,但它不适合我。

我正在显示我的 migration 文件

public function up()

    Schema::create('classes', function (Blueprint $table) 
        $table->increments('id');
        $table->integer('userId')->unsigned();
        $table->string('title');
        $table->string('name');
        $table->string('code')->unique();
        $table->integer('capacity')->unsigned();
        $table->integer('tagId')->unsigned();
        $table->foreign('userId')->references('id')->on('users');
        $table->timestamps();
    );


/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()

    Schema::table('classes', function (Blueprint $table) 
        $table->dropForeign(['userId']);
    );
    Schema::drop('classes');

如何解决这个问题?

【问题讨论】:

你检查表并验证外键是否存在? 【参考方案1】:

大多数情况下,当您在 laravel 中运行迁移(无论是向上还是向下),并且沿线发生错误时,事务可能已部分完成而未在迁移表中注册。

如果是这种情况,或者您想删除表是否确实存在外键,那么您应该考虑禁用外键检查,如下所示:

public function down()

    Schema::disableForeignKeyConstraints();
    Schema::drop('classes');
    Schema::enableForeignKeyConstraints();

【讨论】:

以上是关于Laravel:即使使用“dropForeign”方法也不能删除外键的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 laravel 集合返回 500 错误,即使不是在我使用 dd() 检查结果时?

Laravel 5.2 会话闪存即使使用 Web 中间件也无法正常工作

即使没有表单字段,Laravel 也会显示验证错误?

在 Mac 上安装 Laravel 会抛出 laravel,即使在设置 PATH 后也找不到

即使事件被触发,Laravel 监听器也没有被触发

为啥即使我更改为数字,laravel 仍然验证电子邮件?