2010-07-02 81 views
2

我有兩個對象:File和FileDetail。一個文件可以有很多FileDetails,但是FileDetail只能有一個文件。我可以得到這個工作,但我不能從數據庫中刪除任何關鍵約束(我無法刪除文件行,因爲FileDetail依賴於它,反之亦然)。我有以下YAML:一對多和一對一關係的學說yaml

File: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    ... 
    fileDetail_id: integer 
    relations: 
    ... 
    FileDetail: 
     local: fileDetail_id 
     foreign: id 
     cascade: [delete] 

FileDetail: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    file_id: integer 
    ... 
    relations: 
    ... 
    File: 
     local: file_id 
     foreign: id 
     foreignAlias: Revisions 
     cascade: [delete] 

理想是什麼,我想發生的事情是,當我刪除的文件排,所有的孩子都FileDetails刪除。它甚至會很好,如果我可以手動刪除所有FileDetail行,然後在文件列,但由於鍵約束的我無法:

1451 - Cannot delete or update a parent row: a foreign key constraint fails (`file`, CONSTRAINT `file_filedetail_id_file_detail_id` FOREIGN KEY (`filedetail_id`) REFERENCES `file_detail` (`id`)) 

我怎麼會得到這種關係的工作(一方爲一對多,另一方爲一對一)。或者我應該把它看作是雙方多對多的?

回答

5

隨着學說,通常只會在一方定義關係(通常是擁有方),並讓其他方面的工作更好。在這裏,你有一個級聯刪除看起來是雙向的。試着改變你的架構:

File: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    ... 
    relations: 
    ... 
    Revisions: 
     class: FileDetail 
     local: id 
     foreign: file_id 
     type: many 
     cascade: [delete] 

FileDetail: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    file_id: integer 

,並僅在文件側離開cascade。這樣,當您刪除文件時,其關聯的FileDetail記錄也將被刪除。我也改變了別名修訂按你原來的模式,所以你可以做:

$file->Revisions->{some FileDetail field here} 

我想這是你所追求的。我已經從文件記錄中刪除了filedetail_id字段,就好像每個文件可以有多個FileDetail記錄一樣,您的文件記錄將無法將這些記錄的所有ID存儲在一個整數字段中。

最後,我已將type: many添加到擁有方,因此Doctrine知道它是來自File側的一對多關係。

+0

+1。教他他所知道的一切。只花了一個小時... – johnwards 2010-07-04 18:35:11

0

@richsage我的解決方案唯一的問題是,對於我來說,在FileDetail:定義中,file_id:必須具有primary:true。

1

小除了richsage的回答是:

在你在非持有端定義關係的情況下,原則可能有問題,檢測此設置。

一個明顯的症狀是,當您收到一條錯誤消息,指出在引用表中找不到外鍵列時。 在這些情況下,您可以幫助在關係中提供「owningSide」屬性的Doctrine。以上述示例爲基礎:

File: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    ... 
    relations: 
    ... 
    Revisions: 
     class: FileDetail 
     local: id 
     foreign: file_id 
     type: many 
     owningSide: false 
     cascade: [delete]