OnDelete-каскад не «запускается»

#sql #laravel #eloquent #mariadb

#sql #laravel #красноречивый #mariadb

Вопрос:

Я застрял на этом моменте:

Я получил несколько таких миграций:

 <?php

Schema::create('product_categories', function ( $table) {
    $table->bigIncrements('id');
    $table->timestamps();
});


Schema::create('products', function ( $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('category_id')->nullable();
    $table->foreign('category_id')->references('id')->on('product_categories')->onDelete('cascade');
});
 

Это приводит к:

 CREATE TABLE `product` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `category_id` bigint(20) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `product_category_id_foreign` (`category_id`),
  CONSTRAINT `product_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `product_categories` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
 

Но если я удалю product строку, строка category -row останется нетронутой.

Есть идеи, какую ошибку я допустил?

Комментарии:

1. чего именно вы хотите достичь? у вас есть 3 таблицы продукты, категории и сводная таблица категории продуктов?

2. Это работает наоборот. Если вы удалите категорию, все товары с этой категорией также будут удалены.

Ответ №1:

Итак, прямо сейчас он удалит ваш продукт только при удалении ссылки product_category, поскольку именно так вы на него ссылались.

Я предполагаю, что есть ваша таблица категорий, которую вы не связали? Если вы хотите, чтобы категория была удалена при удаляемом продукте, вам нужно будет ссылаться на продукт в вашей таблице категорий с ->onDelete('cascade') в конце. Хотя я не уверен, что это желательно, но я думаю, что это то, что вы пытаетесь сделать?