2015-02-04 4 views
3

두 엔티티 - BackgroundAction이 있습니다. a Background에는 많은 Actions이 있습니다. symfony2 : 삭제시 연결 해제

내가Action하지만 외래 키를 유지 에 원하는 Background을 삭제

. 제약 조건을 만족시키는 방식으로 개체를 효과적으로 고아. 캐스케이드 = { "제거"}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`)) 

현재로서는 해결 방법은 관련 작업을 반복하고 필드를 null로 유지하는 것입니다. 이것이 앞으로 나아갈 수있는 최선의 방법은 아닙니다.

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

그냥 삭제 설정 널 (null)에 대한 데이터베이스 수준에서 제약 조건을 변경하는 데 도움이, 당신은 돈 ' 귀하의 응용 프로그램 코드를 사용하여 데이터베이스 작업을 수행 할 필요가 없습니다. 여기에 주석을 사용하는 또 다른 방법이 있습니다. [* Doctrine 2 OneToMany Cascade SET NULL *] (http://stackoverflow.com/questions/8858645/doctrine-2-onetomany-cascade- set-null) –

+0

가능하면 다음과 중복됩니다. http://stackoverflow.com/questions/12471715/how-exactly-to-use-ondelete-set-null-doctrine2 –

답변

3

참조를 null로 지정할 수있는 doctrine 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; 

희망이