【问题标题】:Doctrine 2 One-To-One unidirectional relationship delete non-owning sideDoctrine 2 一对一的单向关系删除非拥有方
【发布时间】:2011-12-02 00:51:04
【问题描述】:

我有两个具有一对一单向关系的实体:

class Foo {
 ...
/**
 * @OneToOne(targetEntity="Bar")
 */
private $bar;
...
}

class Bar {
...
}

当我尝试删除 Bar 实体时出现此错误:

完整性约束违规:1451 无法删除或更新父行:外键约束失败

如何在不失去删除 Bar 实体的能力的情况下保持单向关系?

【问题讨论】:

    标签: doctrine foreign-keys


    【解决方案1】:

    使用 Doctrine 2,您需要这样做:

    class Foo {
       ...
      /**
       * @OneToOne(targetEntity="Bar")
       * @JoinColumn(name="bar_id", referencedColumnName="id", onDelete="CASCADE")
       */
      private $bar;
      ...
    }
    
    class Bar {
      ...
    }
    

    onDelete="Cascade" 将执行 CappY 在他的回答中所说的(在删除级联时设置您的外键)。这样,当您删除 Bar 实体时,关联的 Foo 实体也将被删除。

    如果您不想删除 Foo 实体,您可以简单地将 onDelete="Cascade" 替换为 onDelete="SET NULL"。

    【讨论】:

      【解决方案2】:

      您可以使用Orphan Removal。它适用于one-to-oneone-to-manymany-to-many 关联。

      您只需像这样添加orphanRemoval=true 选项:

      @OneToOne(targetEntity="Bar", orphanRemoval=true)
      

      【讨论】:

      • orphanRemoval=true 在您尝试删除实体时不起作用
      • orphanRemoval 如果您设法删除 Bar,则有效,然后 Foo 将被学说删除,因为它是一个孤儿
      【解决方案3】:

      在 DELETE 级联上设置你的外键(这也会删除 Foo 记录)或 SET NULL(当你删除 Bar 时这会将列设置为 NULL)

      http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

      【讨论】:

        猜你喜欢
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多