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);
}

person darkbluesun    schedule 04.02.2015    source источник
comment
просто измените свое ограничение на уровне вашей базы данных, чтобы при удалении установить значение null, вам не нужно выполнять работу базы данных с кодом вашего приложения, или вот еще один способ использования аннотаций Doctrine 2 OneToMany Cascade SET NULL   -  person M Khalid Junaid    schedule 04.02.2015
comment
возможно, дубликат этого: stackoverflow.com/questions/12471715/   -  person Ashish Awasthi    schedule 04.02.2015


Ответы (1)


Вы можете добиться этого с помощью поведения доктрины 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;

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

person Matteo    schedule 04.02.2015