Ad

Laravel 5 Deleting A One-to-many Relationship

I have two tables: - Products - Themes

Products belong to a Theme - Themes has many Products.

I want to delete a theme and remove it's association with any Products. In a perfect world deleting a theme would reset the related Products' theme_id to NULL. In my Products table I have tried ->onDelete('cascade') but this deletes both the Theme and corresponding Products. If I do not implement ->onDelete('cascade') I get this error:

QLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (acme.products, CONSTRAINT products_theme_id_foreign FOREIGN KEY (theme_id) REFERENCES themes (id) ON DELETE CASCADE) (SQL: update products set theme_id = , updated_at = 2015-12-28 20:20:05 where id = 1)

Any suggestions would be super helpful. Thank You!

Ad

Answer

You have to define your product foreign key onDelete to set null and also the foreign key field as nullable

  Schema::create('products', function(Blueprint $t) {
        ...
        $t->integer('theme_id')->unsigned()->nullable();
        ...

        $t->foreign('theme_id')->references('id')->on('themes')
            ->onDelete('set null');
    });
Ad
source: stackoverflow.com
Ad