2014-01-27 23 views
2

在使用laravel的多态关系时保持数据库完整性的最佳实践是什么?Laravel多态关系/模型观察者和数据库完整性

我正在使用模型观察者来更新/删除相关模型。因此,例如,我在删除客户时删除了有关“已删除”事件的相关文档。 这意味着如果在删除第一个文档时发生错误,其余的将保留在数据库中......或者如果我在事务中删除文档,则它们全部将保留在数据库中,而父对象将被删除...

回答

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表执行查询(这里的PostgreSQL语法)这样的:

DELETE FROM photos WHERE imageable_id = OLD.id AND imageable_type = 'staff' 

这样,每次删除员工原料时,所有参考照片都将在同一交易中删除。

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