voskobovich / yii2-many-to-many-behavior

This behavior soon will be DEPRECATED. See the link:

Home Page:https://github.com/voskobovich/yii2-linker-behavior

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

При удалении ошибка

des1roer opened this issue · comments

Caused by: PDOException

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (lesson.worker_has_perk, CONSTRAINT fk_worker_has_perk_worker1 FOREIGN KEY (worker_id) REFERENCES worker (id) ON DELETE NO ACTION ON UPDATE NO ACTION)

Суть ошибки найдёшь в гугле. Решений несколько:

  1. удалить фк
  2. проверять перед удалением "а можно ли удалять"
  3. измерить в фк restrict на cascade

ну да. нужно было тип на каскад. но думал это предусмотрено

Предусмотрено где?
Тип ставится не от балды, а по требованиям бизнес логики.
Если там нужен restrict значит нужно делать доп проверки чтобы юзер не видел ошибки.

а как тогда это проверить можно?

Допустим у тебя связь - Order - OrderHasProduct - Product

  1. Продукт не может быть удален, пока он используется в заказе (иначе нарушиться целостность заказа) и для этого надо поставить на fk OrderHasProduct -> Product тип restrict (при удалении продукта проверить, нет ли связей с заказом).

  2. При удалении заказа нужно удалить все связи с продуктами. Ставим на fk Order - OrderHasProduct тип cascade (при удалении заказа удалить все связи с продуктами).

При такой схеме, если попытаться удалить продукт который есть в заказе - вылетит твоя ошибка. Чтобы юзеру показать что-то нормальное - проверь со сколькими заказами связан продукт перед удалением. Если больше 0, значит покажи красивое предупреждение и откажи в удалении.