2011-10-14 21 views
10

Ciao, ho un problema quando provo a rimuovere le entità in una relazione OneToMany. Dopo alcune ore di debug, ho provato a eseguire il downgrade della dottrina dall'ultima 2.1.2 alla 2.0.2 e improvvisamente inizia a funzionare.Doctrine 2.0 vs 2.1 cascade remove OneToMany

Immaginare due entità Società e indirizzo in relazione 1: N.

/** 
* @Entity 
*/ 
class Company extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Collection 
    * @OneToMany(targetEntity="Address",mappedBy="company", cascade={"persist","remove"}) 
    */ 
private $addresses; 
} 



/** 
* @Entity 
*/ 
class Address extends Entity 
{ 

/** 
    * @var integer 
    * @id @Column(type="integer") 
    * @generatedValue 
    */ 
private $id; 

/** 
    * @var Company 
    * @ManyToOne(targetEntity="Company", inversedBy="addresses") 
    * @JoinColumn(name="company_id", referencedColumnName="id",nullable=false) 
    */ 
private $company; 
} 

quando provo a rimuovere l'entità Società, vorrei che anche gli indirizzi assegnati venissero rimossi.

$em->remove($company); 
$em->flush(); 

Nella doc. 2.1.2 la cancellazione degli indirizzi non viene eseguita, quindi il vincolo di integrità fallisce. Nella versione 2.0.2 funziona perfettamente. Se io uso l'estensione EntityAudit https://github.com/simplethings/EntityAudit, LogRevisionListener esegue il versioning corretto degli indirizzi entity (impostarli revtype = DEL) nella doc. 2.1.2 (ovviamente anche in 2.0.2) ma UnitOfWork non lo rimuove.

C'è qualche differenza su come gestire la rimozione a cascata in 2.0.2 e in 2.1.2?

La ringrazio molto

+0

Oggi sono incappato in questo problema, sto usando 2.1.6. :/ – mokagio

+0

Beh, devo correggermi, ora funziona per me! Stavo usando 'cascade = {" all "}' ma quando l'ho cambiato in 'cascade = {" remove "}' tutto ha iniziato a funzionare bene. – mokagio

+0

Anche se devo dire che probabilmente il mio problema potrebbe non essere completamente dovuto al set di annotazioni o allo stesso Doctrine, perché sto facendo una manipolazione intensiva sulle entità e, dopo qualche test sulla combinazione delle opzioni a cascata, ho scoperto che il L'opzione "unione" era quella che creava problemi. Spero che sia d'aiuto comunque :) – mokagio

risposta

1

Ho incontrato lo stesso problema e ho risolto lui con quel codice:

$em->remove($object); 
$em->flush(); 
$em->remove($user); 
$em->flush(); 

Forse si può usare un findAll sul company per gli indirizzi e rimuovere questo con un foreach del genere:

// Return all the addresses of the company 
$addresses = $em->getRepository(...)->findAllAddressesByCompany($company); 
$em->remove($company); 
foreach ($address in $addresses) 
{ 
    $em->remove($address); 
} 

Questo non è un buon metodo, ma per ora, è tutto quello che ho trovato.

+1

Ho risolto il downgrade della dottrina :) grazie, ma non è il metodo che sto cercando :(potrebbe essere probabilmente un bug (o una funzionalità?) – stefi

10

Provare a utilizzare questo sull'attributo addresses del vostro Company Classe

@OneToMany(targetEntity="Address",mappedBy="company", 
cascade={"persist"}, orphanRemoval=true) 
+1

I'm usando la dottrina 2.2.3 e ancora lo stesso, ho dovuto aggiungere orphanRemoval = true, un po 'strano perché non sto rimuovendo da un lato così da non creare orfani Forse perché il lato più è il lato proprietario e sto rimuovendo da un lato .Gli aggiornamenti funzionano perché il lato più è il proprietario e sto entrambi usando '$ this-> addSomething (theThing)' e 'theThing-> setSomething ($ this)' dove come se stavo cancellando il TheThing non ci sono impostazioni , solo '$ this-> removeSomething (theThing)' – HMR

3

Ho avuto lo stesso problema ... Relazioni sono state aggiunte o aggiornate, ma non eliminati, anche se ho avuto a cascata: [persistono , rimuovi].

Ho scoperto che non avevo bisogno dell'attributo "remove" in "cascade", ma ho dovuto aggiungere orphanRemoval: true.

Stavo impazzendo, hai reso la mia giornata!

Problemi correlati