【发布时间】:2020-01-06 14:06:10
【问题描述】:
我有 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
我需要当有人从“表”中删除一行时,也从“过滤器”和“过滤器用户”中删除
这 3 个值:
table.id = 5 -> filters.id = 10 -> filter_users.filter_id = 10
使用DELETE CASCADE 在“filters”和“filter_users”表上设置FK 就足够了:
ALTER TABLE public.filters ADD CONSTRAINT filters_fk FOREIGN KEY (table_id) REFERENCES public."tables"(id) ON DELETE CASCADE;
或者我应该对模型使用一些限制吗?
【问题讨论】:
-
如果这是
belongsToMany()/many-to-many关系,如果您删除tables中的某些内容,您将不想删除filters中的任何内容,因为它可能与tables中的另一条记录相关。删除中间数据就像$table->filters()->detach();一样简单(假设您定义了正确的关系) -
我尝试了关于 CASCADE 的内容,但由于带有 id 的旧数据不再存在于一个表或另一个表中,因此我遇到了很多错误。你说的听起来是对的,但是这里的代码是关于删除、插入等的自定义方法的混乱,里面有原始的 sql。我必须在
Table模型中放入更多原始 sql 以删除我需要的“级联”:( -
您可以简单地为 filter 和 filter_users 表添加级联
标签: sql laravel postgresql