2012-06-08 79 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