使用laravel的多态关系时保持数据库完整性的最佳做法是什么?
我正在使用Model Observers来更新/删除相关模型。例如,我在删除客户时删除了“已删除”事件的相关文档。 这意味着如果在删除第一个文档时发生错误,其余的将保留在数据库中......或者如果我在事务中包装文档删除,所有这些文档将在父对象被删除时保留在数据库中...
答案 0 :(得分:0)
不幸的是,这个问题没有好的答案。由于多态关系,您无法使用外键保持数据库的完整性。
尝试的一种方法是使用数据库触发器。由于Laravel多态系统在引用相关模型的表上保留“类型”列,因此可以在可以变形的表上放置“before delete”触发器以删除引用要删除的原始的所有出现。
例如,使用Laravel documentation中使用的结构:
staff
id - integer
name - string
orders
id - integer
price - integer
photos
id - integer
path - string
imageable_id - integer
imageable_type - string
你可以在执行查询的staff
表上放置一个“before delete”触发器(这里是PostgreSQL语法):
DELETE FROM photos WHERE imageable_id = OLD.id AND imageable_type = 'staff'
这样,每次删除原始人员时,所有引用的照片都将在同一事务中删除。
我真的不知道这是否是保持这种关系完整性的最好方法,但它似乎是一种有效的关系。