我有3个应该相关的表,但它们不是:
'tables' <-- this is a normal Laravel table with created_at and updated_at
--------
id|name
--------
5 |people
'filters' <-- this is a normal Laravel table with created_at and updated_at
-------------
id | table_id
-------------
10 | 5
'filter_users' <- this is a pivot table
-------------
user_id|filter_id
-------------
66 | 10
我需要当有人从“表”中删除一行时,还要从“过滤器”和“ filter_users”中删除
这3个值:
table.id = 5 -> filters.id = 10 -> filter_users.filter_id = 10
使用FK
在“过滤器”和“ filter_users”表上同时设置DELETE CASCADE
即可:
ALTER TABLE public.filters ADD CONSTRAINT filters_fk FOREIGN KEY (table_id) REFERENCES public."tables"(id) ON DELETE CASCADE;
还是应该对模型使用一些限制?
答案 0 :(得分:0)
您可以不受限制地使用触发器
Create trigger sample
After DELETE on
Table for Each Row
DELETE FROM FILTERS F JOIN
FILTER_USERS FU ON
New.ID=F.TABLEID AND
F.ID=FU.FILTERID
END
答案 1 :(得分:0)
在大多数情况下,使用ON DELETE CASCADE
的数据库解决方案已经足够好,直到在模型上使用SoftDelete
为止。
在这种情况下,ON DELETE CASCADE
不会被触发,因为它只是一个更新。您仍可以像@Himanshu所说的那样使它与trigger
一起使用,但是您需要设置两个触发器(更新和删除)。
最后一种解决方案,而不是最好的解决方案,是通过重载模型中的delete()
方法来通过代码实现。