3

我有两个实体 -BackgroundAction. 一个Background有很多Actions

当我删除 aBackground我想保留Action但为的外键。以满足约束的方式有效地孤立实体。我已经阅读了很多关于cascade={"remove"}orphanRemoval的文章和问题,但所有这些似乎都会导致删除孤立的动作(根本不是我想要的)或什么都不做——这会导致违反完整性约束.

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`)) 

目前,我找到的解决方案是遍历相关的 Actions 并将该字段设为 null 并持续存在。这不可能是最好的前进方式。

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

1 回答 1

3

您可以通过可以使引用无效的原则 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;

希望这可以帮助

于 2015-02-04T06:22:24.103 回答