2014-07-07 34 views
46

Desidero verificare la mia comprensione delle operazioni in cascata sulle associazioni di Doctrine. Ai fini di questa domanda, ho due modelli: Customer e Insuree.Informazioni su Doctrine Cascade Operations

Se io definisco una relazione molti a molti relazione tra un Customer e Insuree e impostare cascade{"all"}, capisco che questa volontà:

  • Aggiunta di un nuovo all'assicurato a un cliente persisterà questa dell'assicurato e creare un'associazione in unisciti alla tabella
  • La rimozione di un certificato dalla raccolta separerà l'assicurato dal cliente e separerà il cliente dall'assicurato.
  • L'eliminazione del cliente eliminerà tutti gli assicurati associati al cliente.

Questa è la definizione dell'associazione su Customers.

/** 
* @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"}) 
* @ORM\JoinTable(name="customer_insuree", 
*  joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")} 
*) 
*/ 
protected $insurees; 

Se io definisco l'inverso molti a molti relazione tra un Insuree e Customer e impostare cascade{"all"}, capisco che questa volontà:

  • L'aggiunta di un nuovo cliente per un all'assicurato persisterà questo cliente e creare un'associazione nella tabella di join.
  • La rimozione di un cliente dalla raccolta scollegherà il cliente dall'assicurato e separerà l'assicurato dal cliente.
  • Eliminando l'assicurato verranno eliminati tutti i clienti associati.

Questa è la definizione dell'associazione su Insurees.

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"}) 
*/ 
protected $customers; 

Se dunque io definisco il rapporto come a cascata sul persistere, si fondono e staccare - eliminando l'assicurato non cancellerà tutti i clienti associati - sarà solo rimuovere le associazioni tra l'assicurato ei suoi clienti?

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"}) 
*/ 
protected $customers; 
+1

Non riesci a controllare se la tua comprensione delle relazioni a cascata è corretta creando alcuni '' Clienti' e 'Insuree's e inizia a cancellare/aggiungere record? – undefined

risposta

103

persistono & rimuovere

Lei ha ragione su cascade={"persist"} il che significa che un'entità persistente A, Doctrine persisterà anche tutte le entità B nella collezione.

Si è anche corretto su cascade={"remove"} che significa che rimuovendo l'entità A, Doctrine rimuoverà anche tutte le entità B nella Raccolta.
Ma dubito che vorreste mai usarlo su un'associazione ManyToMany, perché quando rimuovete l'entità A che mette in cascata questa operazione a tutte le entità B, quelle entità B potrebbero essere associate ad altre entità A.

staccare & merge

Sei non corrette su cascade={"detach"} e cascade={"merge"}:

Aggiunta/rimozione entità della Collezione è qualcosa che si bisogno di fare (nel codice). Leggi su questo here.

Detach significa che si scollega un'entità da EntityManager. EntityManager non gestirà più quell'entità. Ciò rende un'entità distaccata la stessa di un'entità appena creata, eccetto che è già nel database (ma l'EntityManager è stato reso inconsapevole di ciò).

In altre parole: cascade={"detach"} significa che l'entità distaccante A, Doctrine distaccherà anche tutte le entità B nella Raccolta.

Merge è l'opposto di staccare: Si fondono un'entità indipendente di nuovo nel EntityManager.
Notare che merge() restituirà effettivamente un nuovo oggetto gestito nuovo, l'oggetto scollegato passato non rimane gestito.