I have user_id fk column in my table
$table->foreign('user_id')->references('id')->on('users');
I should add on cascade delete feature to this existing column. How can I do this?
I have user_id fk column in my table
$table->foreign('user_id')->references('id')->on('users');
I should add on cascade delete feature to this existing column. How can I do this?
Drop foreign key first. Thanks to Razor for this tip
$table->dropForeign('answers_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
In my case, i'll need to put the col name in an array else that will be an error.
Schema::table('transactions', function (Blueprint $table) {
$table->dropForeign(['transactions_order_id_foreign']);
$table->foreign('order_id')
->references('id')->on('orders')
->onDelete('cascade')
->change();
});
mysql 5.7 ver
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Laravel schema builder can't modify columns at the current state, so you will use raw queries. You will have to drop and recreate the constraint:
PostgreSQL
function up()
{
DB::statement('alter table answers drop constraint answers_user_id_foreign,
add constraint answers_user_id_foreign
foreign key (user_id)
references users(id)
on delete cascade;'
);
}
function down()
{
DB::statement('alter table answers drop constraint answers_user_id_foreign,
add constraint answers_user_id_foreign
foreign key (user_id)
references users(id);'
);
}
MySQL
function up()
{
DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
DB::statement('alter table answers add constraint answers_user_id_foreign
foreign key (user_id)
references users(id)
on delete cascade;'
);
}
function down()
{
DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
DB::statement('alter table answers add constraint answers_user_id_foreign
foreign key (user_id)
references users(id);'
);
}
Thanks for question answer. Help me get to this working code in L5.1 :
public function up()
{
Schema::table('transactions', function (Blueprint $table) {
$table->dropForeign('transactions_order_id_foreign');
$table->foreign('order_id')
->references('id')->on('orders')
->onDelete('cascade')
->change();
});
Schema::table('orders', function (Blueprint $table) {
$table->dropForeign('orders_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade')
->change();
});
}
Use the unsigned function to user_id
in the present migration:
$table->interger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('table_name')->onDelete('cascade');
As of laravel 7.0
you can use $table->foreignId('user_id');
it is an alias of $table->unsignedBigInteger('user_id');
So our oneline solution to make the foreign key column delete cascade is as below:
$table->foreignId('user_id')->constrained('users')->onDelete('cascade');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
I am assuming you used Illuminate\Database\Schema\Blueprint::primary()
to create users.id
. If that is the case, then users.id
will be unsigned. Therefore your foreign key column user_id
must also be unsigned.
This is a better way to create of foreign key relationship
$table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade');
OR
$table->unsignedBigInteger('product_id');
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');