2011-12-02 15 views
5

non proprietario Ho due entità con un rapporto unidirezionale one-to-one:Doctrine 2 One-To-One rapporto unidirezionale eliminare lato

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

class Bar { 
... 
} 

Quando cerco di eliminare un'entità Bar ottengo questo errore :

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

Come faccio a mantenere un rapporto unidirezionale senza perdere la possibilità di cancellare le entità Bar?

risposta

5

Con Doctrine 2, questo è ciò che è necessario fare:

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

class Bar { 
    ... 
} 

Il onDelete = "Cascade" farà quello che ha detto Cappy nella sua risposta (configurazione di un chiave esterna sul delete cascade). In questo modo, quando elimini la tua entità Bar, anche l'entità Foo associata verrà rimossa.

Se si preferisce non rimuovere l'entità Foo, è sufficiente sostituire onDelete = "Cascade" con onDelete = "SET NULL".

2

È possibile utilizzare Orphan Removal. Funziona con le associazioni one-to-one, one-to-many e many-to-many.

è sufficiente aggiungere l'opzione orphanRemoval=true in questo modo:

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

Spero che questo potrebbe aiutare qualcuno.