如何使用 laravel 迁移向现有键添加约束

How to add constraints to existing keys using laravel migration

我目前的项目中有一个数据库已经投入生产。但是我在之前的迁移中没有使用约束。现在我有 tables productsshops 和中间 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_idproduct_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');
    });

  }
}