Symfony2: отключить ассоциации при удалении

У меня есть две сущности - Background а также Action, Background имеет много Actions,

Когда я удаляю Background Я хочу сохранить 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`)) 

На данный момент решение, которое я нашел, состояло в том, чтобы пройтись по связанным действиям, обнулить поле и сохранить. Это не может быть лучшим способом продвижения вперед.

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

1 ответ

Решение

Вы можете достичь этого с помощью доктрины ondelete поведения, которая может обнулять ссылки.

Вот пример того, как я реализовал это в старом проекте sf2.3:

/**
 * Workaround for circular reference:
 * http://stackru.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;

Надеюсь это поможет

Другие вопросы по тегам