一对一和一对一关系的学说yaml

dra*_*ank 2 php yaml doctrine doctrine-1.2

我有两个对象:File和FileDetail.文件可以有很多FileDetails,但FileDetail只能有一个文件.我可以让它工作,但由于关键的限制,我无法从数据库中删除任何内容(我无法删除文件行,因为FileDetail依赖于它,反之亦然).我有以下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]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要发生的是当我删除File行时,所有子FileDetails也被删除.如果我可以手动删除所有FileDetail行然后是File行,那将会很好,但由于键约束,我无法:

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`))
Run Code Online (Sandbox Code Playgroud)

我如何才能使这种关系发挥作用(一方面是一对多,另一方面是一对一).或者我应该把它视为双方的多对多?

ric*_*age 5

使用Doctrine,通常最好只在一方(通常是拥有方)定义关系,然后让Doctrine解决剩下的问题.在这里,你有一个级联删除,看起来是双向的.尝试将架构更改为:

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
Run Code Online (Sandbox Code Playgroud)

并仅保留cascade在文件端.这样,当您删除文件时,其关联的FileDetail记录也将被删除.我还根据您的原始架构将别名更改为Revisions,因此您将能够:

$file->Revisions->{some FileDetail field here}
Run Code Online (Sandbox Code Playgroud)

我认为你是追求的.我已从文件记录中删除了filedetail_id字段,就好像每个文件可以有许多FileDetail记录一样,您的文件记录将无法在单个整数字段中存储这些记录的所有ID.

最后,我已经添加type: many到了拥有方,因此Doctrine知道它是File端的一对多关系.