使用外键的Laravel可空迁移

时间:2017-06-12 12:35:01

标签: mysql laravel laravel-5

我有itemssupplier_id列和该列的外键。该列不可为空,我想让它可以为空。因此up()方法有效:

$table->integer('supplier_id')->unsigned()->nullable()->change();

但是我无法使down()方法工作,总是会收到错误:

Cannot change column 'supplier_id': used in a foreign key constraint 'items_supplier_id_foreign'

最新尝试:

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('items', function (Blueprint $table) {
            $table->dropForeign(['supplier_id']);
            $table->integer('supplier_id')->unsigned()->nullable(false)->change();
            $table->foreign('supplier_id')->references('id')->on('suppliers');
        });
    }

有什么建议吗?我使用的是Laravel 5.4

2 个答案:

答案 0 :(得分:0)

@apokryfos是对的。见here

  

在对表进行任何更改之前,重要的是简要地查看在您希望更改为NOT NULL的现有列中可以(并且不能)指定哪些数据,确保不允许任何行具有NULL该栏中的价值。

首先,您需要使用seeds填充所有可空值,然后修改列。或者您可以删除supplier_id而不是使用default()方法填充表格中的所有行。

答案 1 :(得分:0)

如果接下来要更改列,仅删除外键约束是不够的,还必须删除其索引。下面是向下迁移功能

Schema::table('users', function (Blueprint $table) {
   $table->dropForeign('users_role_id_foreign');
   $table->dropIndex('users_role_id_foreign');
});

// Conflict with change on same Blueprint instance (strange)
Schema::table('users', function (Blueprint $table) {
    $table->integer('role_id')->change();
});

积分:Github