Php Symfony2:删除时断开关联

Php Symfony2:删除时断开关联,php,symfony,doctrine-orm,relationships,orphan,Php,Symfony,Doctrine Orm,Relationships,Orphan,我有两个实体-背景和动作。 背景有许多动作 当我删除背景时我想保留操作但将外键设为空。以满足约束的方式有效孤立实体。 我读过很多关于cascade={“remove”}和孤立删除的文章和问题,但所有这些似乎要么导致删除孤立操作(根本不是我想要的),要么什么也不做——这会导致违反完整性约束 SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign k

我有两个实体-
背景
动作
背景
有许多
动作

当我删除
背景时
我想保留
操作
但将外键设为空。以满足约束的方式有效孤立实体。 我读过很多关于cascade={“remove”}孤立删除的文章和问题,但所有这些似乎要么导致删除孤立操作(根本不是我想要的),要么什么也不做——这会导致违反完整性约束

SQLSTATE[23000]: Integrity constraint violation: 
1451 Cannot delete or update a parent row: 
a foreign key constraint fails (`Action`, CONSTRAINT
`FK_B7722E25C93D69EA` FOREIGN KEY (`background_id`) 
REFERENCES `Background` (`id`)) 
目前,我找到的解决方案是迭代相关的操作,并将字段设置为null并持久化。这不是最好的办法

foreach ($background->getActions() as $action) {
  $action->setBackground(null);
}

您可以通过允许引用为空的ondelete行为来实现这一点

下面是我如何在旧sf2.3项目中实现此功能的示例:

/**
 * Workaround for circular reference:
 * http://stackoverflow.com/questions/14257004/doctrine2-symfony2-cascading-remove-integrity-constraint-violation-1451
 */

/**
 * @ORM\OneToOne(targetEntity="Acme\DashboardBundle\Entity\AlternativeProposal")
 * @ORM\JoinColumn(name="selected_alternative_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
 */
protected $selectedAlternative;

希望这有帮助

只需在数据库级别更改对on delete set null的约束,您不需要使用应用程序代码处理数据库,或者这里有另一种使用注释的方法,可能与此重复: