'how to rename foreign key in Laravel

I want to rename the foreign key in Laravel.

This is how, I have created it:

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');
        }
    );
}

And now, I want to change account_id to engagement_id. How to do that?



Solution 1:[1]

It should be something like this :

Note : Before Renaming Foreign, You Must Need To Delete Old Foreign And Assign New One

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');
        });
    }
}

Solution 2:[2]

What @rborum explained requires doctrine/dbal package to be installed. Else you could directly execute sql query to rename your key or do any other changes.

Solution 3:[3]

I was able to do this without dropping the column.

Very simply:

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);
});

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Vincent Mimoun-Prat
Solution 2 user10128333
Solution 3 Eskay Amadeus