2015-04-12 15 views
5

Nella mia applicazione symfony2/doctrine2, ho un caso strano in cui quando si persiste un'entità modificata, la modifica non viene scaricata nel database e non posso capisci perchéentità persistente doctrine modificata tra entityManager-> persist e unitOfWork-> persist

Qui di seguito è il mio codice:

$date = $subscription->getPaymentValidUntil()->format('d/m/Y'); 
$period = $payment->getDetail('period'); 
$validDate = $subscription->getPaymentValidUntil() 
    ->add(new\DateInterval($period == Subscription::MONTH ? 'P1M' : 'P1Y')) 
; 

$subscription->setPaymentValidUntil($validDate); 
$this->em->persist($subscription); 

exit(var_dump(array(
    $date, 
    $this->em->getUnitOfWork()->getScheduledEntityUpdates(), 
    $subscription->getPaymentValidUntil(), 
))); 

$this->em->flush(); 

L'uscita del vardump è il seguente:

array (size=3) 
    0 => string '12/05/2015' (length=10) 
    1 => 
    array (size=0) 
     empty 
    2 => 
    object(DateTime)[2295] 
     public 'date' => string '2015-06-12 18:52:37' (length=19) 
     public 'timezone_type' => int 3 
     public 'timezone' => string 'Europe/Paris' (length=12) 

Se Arrossisco prima della vardump o rimuovere la vardump, infatti, il valore di data non lo fa cambiare nel mio database. Perché?

Come si può vedere, aggiungo un mese a questo valore di data, si riflette nell'entità, ma non è pianificato per l'aggiornamento. Come posso risolvere questo ?

EDIT: Ho scavato nella funzione di gestore di entità persistono e ho capito che quando l'entità del dumping in Doctrine \ ORM \ EntityManager :: persistono la data era buona, ma quando il dumping in Doctrine \ ORM \ UnitOfWork: : persistere, la data era stata in qualche modo azzerato alla sua originale:

Doctrine\ORM\EntityManager::persist: discariche l'entità aggiornato

public function persist($entity) 
{ 
    if (! is_object($entity)) { 
     throw ORMInvalidArgumentException::invalidObject('EntityManager#persist()' , $entity); 
    } 

    $this->errorIfClosed(); 

    if ($entity instanceof Subscription) exit(var_dump($entity)); 

    $this->unitOfWork->persist($entity); 
} 

Doctrine \ ORM \ UnitOfWork :: persistere: discariche l'entità non modificata: PERCHE ' ?

private function doPersist($entity, array &$visited) 
{ 
    if ($entity instanceof Subscription) exit(var_dump($entity)); 

     $oid = spl_object_hash($entity); 

     if (isset($visited[$oid])) { 
      return; // Prevent infinite recursion 
     } 
} 
+0

Qual è il tuo '$ abbonamento-> getPaymentValidUntil()'? –

+0

restituisce un datetime che sto modificando. sto aggiungendo più un mese .. Come si può vedere dal mio dump, è impostato su 12/05 prima della modifica, a 12/06 dopo, ma nulla è sheduled per l'aggiornamento. –

+0

Perché si recupera 'getScheduledEntityInsertions' mentre è necessario' getScheduledEntityUpdates'? –

risposta

4

DateTime sono oggetto dopo tutto, e sono sempre passati per riferimento. Quindi, vi consiglio caldamente di modificare il codice in questo modo:

$period = $payment->getDetail('period'); 
$validDate = clone $subscription->getPaymentValidUntil(); 
$validDate->add(new \DateInterval($period == Subscription::MONTH ? 'P1M' : 'P1Y')); 
$subscription->setPaymentValidUntil($validDate); 
$this->em->persist($subscription); 
$this->em->flush(); 

In questo modo, si assicura che si sta passando un oggetto diverso per l'entità, e di evitare qualsiasi sottili bug nel EntityManager.

+0

arf, infine, si trattava di clonare l'oggetto. Grazie! –

Problemi correlati