2010-07-02 67 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]