У меня есть две сущности — Background
а также Action
,
Background
имеет много Actions
,
Когда я удаляю Background
я бы хотел держать Action
но ноль внешний ключ. Эффективно осиротить сущность таким образом, чтобы удовлетворить ограничения.
Я прочитал так много статей и вопросов о Каскад = { «удалить»} а также 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`))
На данный момент решение, которое я нашел, состояло в том, чтобы перебрать все связанные действия, обнулить поле и сохранить. Это не может быть лучшим способом продвижения вперед.
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;
Надеюсь это поможет
Других решений пока нет …