2015-01-05 15 views
9

So che ci sono molti post su questo argomento in generale. Sfortunatamente quelli per lo più gestiscono l'effettiva operazione persistente nel database. Nel mio caso ho un problema che si verifica prima dell'operazione di persistenza:Symfony non rimuove l'entità dalla raccolta

Ho un modulo con un (Doctrine) persistenceCollection di entità. Puoi rimuovere "oggetti" dal DOM tramite javascript. Dopo presentare, quando handleRequest viene chiamato sulla forma, la funzione nel mio soggetto è chiamato, che rimuove l'entità della collezione nell'oggetto stesso, e si chiama come posso controllare nel debugger:

/** 
* Remove prices 
* 
* @param \Whizzpm\Bundle\Entity\Supplier\SupplierPrice $prices 
*/ 
public function removePrice(\Whizzpm\Bundle\Entity\Supplier\SupplierPrice $prices) 
{ 
    $this->prices->removeElement($prices); 
} 

E questa è la definizione di $ prezzi:

/** 
* @var 
* @ORM\OneToMany(targetEntity="SupplierPrice", mappedBy="priceList", cascade={"all"}) 
*/ 
private $prices; 

l'idea di base è quello di confrontare l'entità aggiornato con il suo stato precedente, ma dopo che la funzione di cui sopra ha terminato l'entitiy è ancora in collezione.

Per rendere questo più preciso: Se controllo $ questo subito dopo che "removeElement ($ prices)" è passato, contiene ancora l'oggetto che avrebbe dovuto essere rimosso.

Forse questo è importante:

fornitore (entità principale)

  • listino prezzi (di proprietà di entità principale - anche entità stessa)
    • prezzi (di proprietà del listino, insieme di entità (prezzo articoli)

prezzi è la c ollection di cui l'elemento (prezzo) dovrebbe essere rimosso.

Qualche idea su questo? Posso aggiungere qualsiasi informazione di cui hai bisogno su questa domanda, semplicemente non lo so, quale di essa ha senso, sinceramente ci sono molti carichi.

+0

removeElement funziona solo su un elemento alla volta. I prezzi $ vengono passati a un array o a una singola entità? Chiamarlo $ prezzi invece di $ prezzo è un po 'confuso. – Cerad

+0

La denominazione è causata dalla generazione automatica di codice da parte della dottrina - hai ragione che questo è fonte di confusione. Faccio una soluzione che pubblicherò di seguito, anche se non sono sicuro che potrebbe essere solo una soluzione. – Fuzzzzel

risposta

16

Finalmente ho trovato una soluzione in questo post:

removeElement() and clear() doesn't work in doctrine 2 with array collection property

devo disinserire il valore corrispondente nell'entità possedere troppo:

public function removePrice(\Whizzpm\Bundle\Entity\Supplier\SupplierPrice $prices) 
{ 
    $this->prices->removeElement($prices); 
    $prices->setPriceList(null); 
} 

e aggiungere orphanRemoval = true per l'entità collezione

/** 
* @var 
* @ORM\OneToMany(targetEntity="SupplierPrice", mappedBy="priceList", cascade={"all"}, orphanRemoval=true) 
*/ 
private $prices; 
+2

Divertente, non ho mai sentito parlare di 'orphanRemoval' prima. Immagino sia nascosto da qualche parte nella documentazione di Symfony. La ricerca mi dà solo risultati con altre persone che hanno problemi con esso. Ho avuto lo stesso problema (ora e nei precedenti progetti), e nel mio caso l'unica cosa che dovevo fare era aggiungere 'orphanRemoval = true'; non è necessario impostare altri riferimenti a 'null'. tyvm – ar34z

Problemi correlati