如何在Laravel中重命名外键

12

我想在Laravel中重命名外键。

这是我创建的方式:

Schema::create('holidays', function (Blueprint $table) {
    $table->increments('id');
    $table->timestamps();
    $table->integer('account_id')->unsigned();
    $table->date('holiday_date');
});

if (Schema::hasTable('accounts')) {
    Schema::table(
        'holidays',
        function (Blueprint $table) {
            $table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
        }
    );
}

现在,我想将account_id更改为engagement_id。应该怎么做?


1
可能是Laravel::更新外键的最佳方法的重复。 - Nicklas Kevin Frank
1
可能是 Laravel 迁移中重命名现有列的错误 的重复问题。 - Rahul
4个回答

20

应该是像这样的:

注意:在重命名外键之前,您必须删除旧的外键并分配新的外键

class RenameColumn extends Migration
{

    public function up()
    {
        Schema::table('holidays', function(Blueprint $table) {
            $table->dropForeign('holidays_account_id_foreign');
            $table->renameColumn('account_id', 'engagement_id');

            $table->foreign('engagement_id')->references('id')->on('accounts')->onDelete('cascade');
        });
    }

    public function down()
    {
        Schema::table('holidays', function(Blueprint $table) {
            $table->dropForeign('holidays_engagement_id_foreign');
            $table->renameColumn('account_id', 'engagement_id');

            $table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
        });
    }
}

在 $table->renameColumn('account_id ', 'engagement_id'); 中,'account_id ' 后面有一个额外的空格,应该是 $table->renameColumn('account_id', 'engagement_id');。我找了很久才发现这个问题。 - Miguel Suarez

0

根据@rborum的解释,需要安装doctrine/dbal包。否则,您可以直接执行SQL查询来重命名您的键或进行任何其他更改。


-1

我能在不删除该列的情况下完成这个操作。

非常简单:

public $oldIndex = 'old_constraint_name_foreign';
public $newIndex = 'new_constraint_name_foreign';

public $oldColumn = 'old_column_name';
public $newColumn = 'new_column_name';

Schema::table('my_table', function (Blueprint $table) {
    $table->renameIndex($this->oldIndex, $this->newIndex);
    $table->renameColumn($this->oldColumn, $this->newColumn);
});

-4
你需要使用以下命令创建一个新的迁移: php artisan make:migration rename_column 然后在里面添加以下内容:
class RenameColumn extends Migration
{

    public function up()
    {
        Schema::table('accounts', function(Blueprint $table) {
            $table->renameColumn('account_id ', 'engagement_id');
        });
    }

    public function down()
    {
        Schema::table('accounts', function(Blueprint $table) {
            $table->renameColumn('account_id ', 'engagement_id');
        });
    }
}

然后执行您的迁移:

php artisan migrate

如果您还没有它,您需要Doctrine。您可以通过composer获取:

composer require doctrine/dbal


1
我想要重命名假期表中的外键。 - Trupti
要重命名外键,您必须删除外键,重命名列,然后再添加外键。请参见Vishal Ribdiya的答案。 - Alan Rezende

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接