如何使用 laravel 迁移向现有键添加约束
How to add constraints to existing keys using laravel migration
我目前的项目中有一个数据库已经投入生产。但是我在之前的迁移中没有使用约束。现在我有 tables products
、shops
和中间 table product_shop
。问题是,如果我删除任何已放在某个商店的产品,枢轴仍保留在中间 table。我需要强制我的数据库的引用完整性,即使 product/shop 还没有 changed/deleted。
我不想使用 Laravel 的事件侦听器,因为当我删除一个对象而不先检索它时它们不起作用。让我们考虑这个现有结构,我不想丢失其中的数据:
shops
- id (int, auto-increment, index)
- domain (string)
products
- id (int, auto-increment, index)
- name (string)
- price (float)
product_shop
- id (int, auto-increment, index)
- product_id (int, foreign_key)
- shop_id (int, foreign_key)
现在我想创建一个迁移,我将约束设置为 product_shop.product_id
和 product_shop.shop_id
以及 onDelete: CASCADE, onUpdate: CASCADE
。因此,无论我在哪里或如何删除一个产品——如果我删除一个,所有相关的枢轴也将被删除。
但是我应该如何更改 migration->up()
& migration->down()
中的约束?
class EstablishConstraints extends Migration
{
public function up()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->someMagic('product_id')->moreMagic('CASCADE'); // What here?
$table->someMagic('shop_id')->moreMagic('CASCADE'); // ...and here?
});
}
public function down()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->reverseMagic('product_id'); // How to reverse it?
$table->reverseMagic('shop_id'); // ...on both columns?
});
}
}
谢谢:)
找到的解决方案:
class EstablishConstraints extends Migration
{
public function up()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->foreignId('product_id')->change()
->constrained()
->cascadeOnDelete()
->cascadeOnUpdate();
$table->foreignId('shop_id')->change()
->constrained()
->cascadeOnDelete()
->cascadeOnUpdate();
});
}
public function down()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->dropForeign('product_shop_product_id_foreign');
$table->dropForeign('product_shop_shop_id_foreign');
});
}
}
我目前的项目中有一个数据库已经投入生产。但是我在之前的迁移中没有使用约束。现在我有 tables products
、shops
和中间 table product_shop
。问题是,如果我删除任何已放在某个商店的产品,枢轴仍保留在中间 table。我需要强制我的数据库的引用完整性,即使 product/shop 还没有 changed/deleted。
我不想使用 Laravel 的事件侦听器,因为当我删除一个对象而不先检索它时它们不起作用。让我们考虑这个现有结构,我不想丢失其中的数据:
shops
- id (int, auto-increment, index)
- domain (string)
products
- id (int, auto-increment, index)
- name (string)
- price (float)
product_shop
- id (int, auto-increment, index)
- product_id (int, foreign_key)
- shop_id (int, foreign_key)
现在我想创建一个迁移,我将约束设置为 product_shop.product_id
和 product_shop.shop_id
以及 onDelete: CASCADE, onUpdate: CASCADE
。因此,无论我在哪里或如何删除一个产品——如果我删除一个,所有相关的枢轴也将被删除。
但是我应该如何更改 migration->up()
& migration->down()
中的约束?
class EstablishConstraints extends Migration
{
public function up()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->someMagic('product_id')->moreMagic('CASCADE'); // What here?
$table->someMagic('shop_id')->moreMagic('CASCADE'); // ...and here?
});
}
public function down()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->reverseMagic('product_id'); // How to reverse it?
$table->reverseMagic('shop_id'); // ...on both columns?
});
}
}
谢谢:)
找到的解决方案:
class EstablishConstraints extends Migration
{
public function up()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->foreignId('product_id')->change()
->constrained()
->cascadeOnDelete()
->cascadeOnUpdate();
$table->foreignId('shop_id')->change()
->constrained()
->cascadeOnDelete()
->cascadeOnUpdate();
});
}
public function down()
{
Schema::table('product_shop', function (Blueprint $table) {
$table->dropForeign('product_shop_product_id_foreign');
$table->dropForeign('product_shop_shop_id_foreign');
});
}
}