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
}
}
Qual è il tuo '$ abbonamento-> getPaymentValidUntil()'? –
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. –
Perché si recupera 'getScheduledEntityInsertions' mentre è necessario' getScheduledEntityUpdates'? –