在Laravel迁移中删除外键

时间:2017-05-25 19:30:56

标签: laravel migration

我在从Laravel应用程序中删除一些外键时遇到问题。问题是当我尝试回滚迁移时:

php artisan migrate:rollback

我不知道为什么我在控制台中出错:

  

[照亮\数据库\ QueryException]   SQLSTATE [42000]:语法错误或访问冲突:1091 DROP' role_user_user_id_foreign&#39 ;;检查列/密钥是否存在(SQL:alter table role_user drop foreign key role_user_user_id_foreign

     

[学说\ DBAL \驱动\ PDOException]   SQLSTATE [42000]:语法错误或访问冲突:1091 DROP' role_user_user_id_foreign&#39 ;;检查列/密钥是否存在

     

[PDOException]   SQLSTATE [42000]:语法错误或访问冲突:1091 DROP' role_user_user_id_foreign&#39 ;;检查列/密钥是否存在

下面我显示了我的迁移类:

class UpdateRoleUserTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        schema::table('role_user',function(Blueprint $table){


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

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('role_user', function (Blueprint $table) {
        $table->dropForeign('role_user_user_id_foreign');
        $table->dropForeign('role_user_role_id_foreign');

    });
    }
}

数据库中的我的表已由迁移类创建:

class CreateRoleUserTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {

            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->integer('role_id')->unsigned();

        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('role_user');
    }
}

3 个答案:

答案 0 :(得分:6)

在Laravel的所有> 4.0版本中,它允许将列名放入一个数组中,然后它将自行解析。我试图找到随附的文档,但他们似乎已将其删除了。

在更新迁移中,请尝试以下操作:

Schema::table('role_user', function (Blueprint $table) {
  $table->dropForeign(['user_id']);
  $table->dropForeign(['role_id']);
});

答案 1 :(得分:1)

我在下面修改了你的代码。

onUpdate()public function up() { Schema::table('role_user',function(Blueprint $table) { $table->foreign('user_id')->references('id')->on('users')->onDelete('CASCADE')->onUpdate('CASCADE'); $table->foreign('role_id')->references('id')->on('roles')->onDelete('CASCADE')->onUpdate('CASCADE'); }); } 添加到您的代码中。

public function down() {
    Schema::table('role_user', function (Blueprint $table) {
        $table->dropForeign(['user_id']);
        $table->dropForeign(['role_id']);
    });
}
function setTargeting(config, done) {
    config.targeting = getTargeting(config.slot);
    delete config.prebid;
    done(config);
}

答案 2 :(得分:1)

我只是遇到了这个问题,问题是由于{ lock_guard<mutex> l(mutex); critical section A } func_A(); { lock_guard<mutex> l(mutex); critical section B } 删除了索引而不是列本身。解决方法是在$table->dropForeign([column_name]);函数中将索引放在一个块中,然后将实际列放在单独的块中。必须将它们放在单独的块中,这是因为某些原因与无法在删除列的位置相同的连接中删除键有关。

因此down函数应如下所示:

down

现在您可以运行public function down() { // drop the keys Schema::table('role_user', function (Blueprint $table) { $table->dropForeign(['user_id']); $table->dropForeign(['role_id']); }); // drop the actual columns Schema::table('role_user', function (Blueprint $table) { $table->dropColumn('user_id'); $table->dropColumn('role_id'); }); } 来运行php artisan migrate函数,并运行up来运行php artisan migrate:rollback命令,并且错误不再显示。