2011-12-02 9 views
5

Mam dwa podmioty z relacji jeden-do-jednego jednokierunkowego:Doctrine 2 One-to-One jednokierunkowa relacja usunąć zakaz posiadania drużynie

class Foo { 
... 
/** 
* @OneToOne(targetEntity="Bar") 
*/ 
private $bar; 
... 
} 

class Bar { 
... 
} 

Gdy próbuję usunąć podmiot Bar otrzymuję ten błąd :

Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails

Jak zachować jednokierunkowy związek bez utraty możliwości usuwania elementów paskowych?

Odpowiedz

5

z doktryną 2, to co trzeba zrobić:

class Foo { 
    ... 
    /** 
    * @OneToOne(targetEntity="Bar") 
    * @JoinColumn(name="bar_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    private $bar; 
    ... 
} 

class Bar { 
    ... 
} 

onDelete = „Kaskada” zrobi co Cappy powiedział w swojej odpowiedzi (setup klucz obcy na kasowania kaskady). W ten sposób, po usunięciu encji Bar, skojarzona encja Foo również zostanie usunięta.

Jeśli nie chcesz usunąć swojej jednostki Foo, możesz po prostu zamienić onDelete = "Cascade" na onDelete = "SET NULL".

2

Można użyć Orphan Removal. Działa z powiązaniami one-to-one, one-to-many i many-to-many.

Trzeba tylko dodać opcję orphanRemoval=true takiego:

@OneToOne(targetEntity="Bar", orphanRemoval=true) 

nadzieję, że to może pomóc komuś.