2010-07-20 70 views
0

這是一個奇怪的一個無法刪除的對象,由於外鍵約束

採用此架構:

Contact: 
    actAs: [Timestampable,SoftDelete] 
    columns: 
    first_name: { type: string(255), notnull: true } 
    second_name: { type: string(255), notnull: true } 
    relations: 
    Forums: 
     class: Forum 
     refClass: ContactForum 
     local: forum_id 
     foreign: contact_id 
     foreignAlias: Contacts 
    ContactForums: 
     local: id 
     foreign: contact_id 
     class: ContactForum 
     type: many 
     foreignType: one 
     cascade: [delete] 

Forum: 
    actAs: [Timestampable,SoftDelete] 
    columns: 
    name: { type: string(255), notnull: true } 
    relations: 
    ContactForums: 
     class: ContactForum 
     local: id 
     foreign: forum_id 
     type: many 
     cascade: [delete] 

ContactForum: 
    actAs: [Timestampable] 
    columns: 
    contact_id: { type: integer, primary: true } 
    forum_id: { type: integer, primary: true } 

然後,如果我們到Contact對象幾個Forum對象的關聯,然後試着刪除此Contact對象,我們收到此錯誤信息:

完整性約束違規:19 contact_forum.created_at可能無法 NULL

如果您將SoftDelete添加到鏈接表中,則刪除工作正常,SoftDelete也會正常工作。但是,我們不希望鏈接表上的SoftDelete,因爲它意味着我們的主鍵無法正常工作。這是一個錯誤?

回答

0

我認爲你的多對多關係的id會被搞砸,假設交響樂使用Doctrine 1.2.2。試試這個:

Contact: 
    actAs: [Timestampable,SoftDelete] 
    columns: 
    first_name: { type: string(255), notnull: true } 
    second_name: { type: string(255), notnull: true } 
    relations: 
    Forums: 
     refClass: ContactForum 
     local: contact_id 
     foreign: forum_id 
     cascade: [delete] 

Forum: 
    actAs: [Timestampable,SoftDelete] 
    columns: 
    name: { type: string(255), notnull: true } 
    relations: 
    Contacts: 
     refClass: ContactForum 
     local: forum_id 
     foreign: contact_id 
     cascade: [delete] 

ContactForum: 
    actAs: [Timestampable] 
    columns: 
    contact_id: { type: integer, primary: true } 
    forum_id: { type: integer, primary: true } 

的關係,指定與refClass,localforeign類時表示「這代表我對這個其他類的表列」和「這個其他類表中的列表示其他「。

編輯:我不確定您在聯繫人下的論壇關係的定義是否正確。假設你只需要一個多對多的關係,它可以被刪除。

雙編輯:看。以下是適當運作和級聯多對多關係所需的所有模式。您不應該需要定義兩個關係才能正確級聯刪除。

+0

模式是正確的。我不需要在論壇表上定義rel。問題在於聯繫人表和鏈接表。第二種關係被定義爲確保刪除級聯到鏈接表。這是什麼突破。將軟刪除添加到鏈接表,並沒有問題。我想使用應用程序刪除而不是數據庫級聯刪除。 – johnwards 2010-07-20 21:43:32

+0

如果您不想使用db級聯刪除,則不要在模式中使用cascade:[delete]。它生成sql。 另外,我見過的使用Doctrine編寫多對多關係的每個源代碼都沒有按照自己的方式定義它們。如果你確定這就是你想要的,那麼很好,但它確實看起來像你有一些多餘的,如果沒有不正確的東西那裏。 – jeremiahd 2010-07-21 03:55:24

+2

'級聯:[刪除]'是應用程序刪除。 'onDelete:[CASCADE]'是db級聯刪除。見http://www.doctrine-project.org/projects/orm/1.2/docs/manual/defining-models%3Atransitive-persistence%3Adatabase-level-cascades/en – richsage 2010-07-21 07:40:19