2013-05-22 14 views
9

Qualcuno può spiegare a me questo:Come usare l'opzione cascade in Doctrine2 per far sì che le entità associate persistano automaticamente?

$user = new User(); 

/* why do I have to call Entity Comment while trying to insert into db? */ 
$myFirstComment = new Comment(); 

$user->addComment($myFirstComment); 

$em->persist($user); 
$em->persist($myFirstComment); 
$em->flush(); 

Perché devo chiamare Entity commento durante il tentativo di inserire nel db?

Ho una cascata per quello.

  1. questo significa che se ho 50 relazione in User Entity con altri soggetti devo chiamare ogni relazione manualmente quando si cerca di aggiornamento/inserimento/cancellazione?
  2. Perché esiste una cascata se devo fare tutto manualmente?

Se devo chiamare manualmente tutta la relazione, è quasi stupido usare Doctrine.

Non capisco. Qualsiasi aiuto è apprezzato.

Questo è collegato con questo: doctrine 2, unable to insert to database when relation is present

+0

Ho un'altra parola, perché devo chiamare il riferimento ad un'altra entità se ho una cascata? –

+0

Per farla breve: Se ho un'associazione da un'entità all'altra devo chiamare sempre quell'altra entità su inserti/aggiornamenti. Non posso dire $ user-> addComment ("qualche commento"), devo chiamare la relazione e quindi fare $ user-> addComment ("qualche commento"). Questo ha senso, ma è un po 'stupido. Cosa succede se ho 50 relazioni? Per chiamare ogni relazione su insert/update? Doctrine è ottimo per selezionare ma fa schifo per tutto il resto se si hanno relazioni. Devo fare 50 volte $ this-> em-> getReference ('nome entità') ..... –

+1

Ho risposto alla tua domanda con molte spiegazioni e il suggerimento alla documentazione + allegato un codice exmaple. per favore accetta la risposta se ti ha aiutato :) – nifr

risposta

19

Per avere Dottrina gestire automaticamente la persistenza della vostra proprietà User#comments è necessario impostare a cascata per l'operazione "persistono".

La cascata (persistono, rimuovere, unire, tutti) opzione offre la possibilità di ommit ...

$em->persist($myFirstComment); 

... se lo si imposta correttamente sul lato inverso di una relazione bidirezionale, per esempio . Si può anche rimuovere automaticamente User#comments se si rimuove un'entità Utente con cascata "rimuovi"!

esempio:

/** 
* Bidirectional - One-To-Many (INVERSE SIDE) 
* 
* @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"}) 
*/ 
private $comments; 

Per saperne di più sulla mappatura Association e cascata nel Transistive Persistence/Cascade Options capitolo della documentazione.

Si ricorda:

Dottrina controllerà solo il lato possedere di un'associazione per le modifiche.

Le modifiche apportate solo al lato inverso di un'associazione vengono ignorate. Assicurati di aggiornare entrambi i lati di un'associazione bidirezionale (o almeno il lato possessore, dal punto di vista della dottrina)

  • associazioni OneToMany non sono mai dalla parte proprietaria.
  • La parte inversa deve utilizzare l'attributo mappedBy della dichiarazione di mapping OneToOne, OneToMany o ManyToMany. L'attributo mappedBy contiene il nome del campo di associazione sul lato proprietario
  • Il lato proprietario deve utilizzare l'attributo inversedBy della dichiarazione di mapping OneToOne, ManyToOne o ManyToMany. L'attributo inversedBy contiene il nome del campo di associazione sul lato opposto.
  • ManyToOne è sempre il lato proprietario di un'associazione bidirezionale.
  • OneToMany è sempre il lato inverso di un'associazione bidirezionale.

Inoltre:

devi solo chiamare persistere se si crea una nuova entità di radice (cioè $user = new User()) che non è già riuscito dalla dottrina (e non dovete chiamare persistono sul $myFirstComment nella vostra esempio se hai impostato correttamente l'opzione cascade).

Altrimenti è sufficiente chiamare a filo se l'entità non è stata rimossa per qualche motivo.

+1

Poiché le operazioni in cascata guardano solo in caso di modifiche laterali proprietarie - puoi spiegare la differenza nell'impostare il funzionamento in cascata sul lato proprietario e sul lato iverse? Entrambe le parti hanno l'opzione cascata e io non capisco perché se ci sono solo un lato di guardia. – Arkemlar

Problemi correlati