2012-06-08 91 views
0

我与Doctrine2.2.2工作结合Symfony的2.0.15。我注意到,使用类表继承,当例如:Doctrine2类表继承和级联删除

/** 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"}) 
*/ 

这将创建一个外键级联删除子实体/表(在这种情况下,公司雇员)的约束。主义的documentation on this含有一种重要的前瞻性黄色的盒子,上面写着:

当你不使用SchemaTool生成所需的SQL你 应该知道,删除一类表继承利用了 外键属性的ON DELETE CASCADE在所有数据库 实现中。实现此故障自己将导致数据库 死行。

这是没有意义的我。这是否意味着如果您不使用SchemaTool,则Doctrine将创建外键级联删除约束?如果有人使用SchemaTool,Doctrine会使用它的内置级联功能吗?

回答

1

是什么要说的是,当你产生与SchemaTool的SQL,它也将相应的ON DELETE CASCADE部件添加到您的外键约束。

ALTER TABLE Employee ADD CONSTRAINT FK_55D6C234BF396750 
    FOREIGN KEY (id) REFERENCES Parent(id) ON DELETE CASCADE; 

如果不使用SchemaTool,你需要确保的是,外键约束有ON DELETE CASCADE一部分,或者当您从职员表中删除行,你最终会在孤立的行你的父表。

+0

好的,知道了。希望有人会清理这个语法。出于好奇,是否有任何方法可以使用Doctrine自己的级联功能而不是ON DELETE CASCADE? – nurikabe

+0

我不这么认为,那可能是件好事。让数据库执行级联删除是正确的选择。例如,如果您手动从两个表中的任何一个中删除记录,则最终会生成一个包含一半数据的孤立记录。不完全是你想要在你的数据库中。当您希望与自己的孩子一起删除整个实体(这里的区别在于,用连接表继承结构,你有每桌一个实体在2个表,而不是一个实体)学说的级联功能更加有用。 –

+0

优秀点。 – nurikabe