Laravel多态关系/模型观察者和数据库完整性

时间:2014-01-27 15:52:21

标签: php laravel relational-database polymorphism

使用laravel的多态关系时保持数据库完整性的最佳做法是什么?

我正在使用Model Observers来更新/删除相关模型。例如,我在删除客户时删除了“已删除”事件的相关文档。 这意味着如果在删除第一个文档时发生错误,其余的将保留在数据库中......或者如果我在事务中包装文档删除,所有这些文档将在父对象被删除时保留在数据库中...

1 个答案:

答案 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'

这样,每次删除原始人员时,所有引用的照片都将在同一事务中删除。

我真的不知道这是否是保持这种关系完整性的最好方法,但它似乎是一种有效的关系。