由于外键约束,无法删除对象

时间:2010-07-20 19:57:41

标签: debugging symfony1 doctrine

这是一个奇怪的

采用这种模式:

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 }

然后,如果我们将几个Forum对象关联到Contact对象,然后尝试删除此Contact对象,我们会收到以下错误消息:

  

完整性约束违规:19   contact_forum.created_at可能不是   NULL

如果将SoftDelete添加到链接表,则删除工作正常,SoftDelete也是如此。但是我们不希望链接表上有SoftDelete,因为这意味着我们的主键无法正常工作。这是一个错误吗?

2 个答案:

答案 0 :(得分:1)

这是一个学说错误。这里的错误报告:http://www.doctrine-project.org/jira/browse/DC-795,修复补丁。

答案 1 :(得分:0)

我认为,假设交响乐正在使用Doctrine 1.2.2,你的多对多关系的ID就会被搞砸了。试试这个:

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表示“此另一个类'表中代表我的列”和“此其他类表上的列表示”另一个“,分别。”

编辑:我不确定您在联系人下的论坛关系的定义是否正确。假设您只需要多对多关系,就可以将其删除。

Double Edit:看。以下是正确运行和级联多对多关系所需的所有模式。您不需要定义两个关系来正确级联删除。