Laravel,从数据库中删除相关数据

时间:2019-09-03 16:24:45

标签: sql laravel postgresql

我有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;

还是应该对模型使用一些限制?

2 个答案:

答案 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()方法来通过代码实现。