2015-04-12 17 views
5

Symfony2/doctrine2 uygulamasında, değiştirilmiş bir varlıkta ısrar edildiğinde, değişikliğin veritabanına akıtılmadığı bir durumum var. nedenini anla.doktrin varlığını sürdüren varlık entityManager-> persist ve unitOfWork-> arasında değişti

$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(); 

vardump çıktısı şudur: Aşağıda

benim kodudur

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) 

Ben vardump önce floş veya vardump kaldırırsanız, gerçekten, tarih değeri yok veritabanımda değişiklik. Niye ya?

Gördüğünüz gibi, bu tarih değerine bir ay ekledim, varlığa yansıtılıyor, ancak güncelleştirme için planlanmadı. Bunu Nasıl Çözebilirim ?

DÜZENLEME: fonksiyonunu devam varlık yöneticisi içine kazılırken oldum ve Doktrin içinde varlık damping zaman \ ORM \ EntityManager :: tarih iyiydi inat anladım ama Doktrin \ ORM \ UnitOfWork damping zaman: :

Doctrine\ORM\EntityManager::persist: tarih nasılsa orijinal birine reseted olmuştu devam etmesi güncellenmiş bir varlık

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 döker \ ORM \ UnitOfWork :: inat: modifiye edilmemiş varlık döker: NEDEN ?

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

$ aboneliğiniz - getPaymentValidUntil() 'nedir? –

+0

bir tarih dönüyor, değiştiriyorum. Bir ay ekliyorum artı .. Benim çöplüğümden görebildiğiniz gibi, değişiklikten önce 12/05, sonra da 12/06 olarak ayarlandı, ancak güncelleme için hiçbir şey ayarlanmadı. –

+0

"getScheduledEntityUpdates" öğesine ihtiyacınız olduğunda getScheduledEntityInsertions öğesini neden getiriyorsunuz? –

cevap

4

DateTime Sonuçta amacı olan ve her zaman referans olarak geçirilir. Yani, şiddetle böyle kodunuzu düzenlemek için önermek:

$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(); 

Bu şekilde, sen varlık için farklı bir nesne geçirildiğinden emin olmak ve EntityManager herhangi ince hata kaçının.

+0

arf, sonunda, bu nesnenin klonlanmasıyla ilgiliydı. Teşekkürler! –

İlgili konular