在我的symfony2 2/ modified 2应用程序中,我遇到了一个奇怪的情况:当持久化修改的实体时,更改不会被刷新到数据库中,而且我也不明白为什么。
下面是我的代码:
$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的输出如下:
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)如果在vardump之前刷新或移除vardump,则日期值在我的数据库中不会更改。为什么?
如您所见,我将一个月的日期值添加到此日期值中,它反映在实体中,但没有计划更新。我怎么才能解决这个问题?
编辑:我钻研了实体管理器持久化函数,我发现在Doctrine\ORM\EntityManager::持久化中转储实体时,日期是好的,但是当将其转储到Doctrine\ORM\UnitOfWork::persist时,日期以某种方式被重新调整到原来的日期:
Doctrine\ORM\EntityManager::persist:转储更新的实体
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::persist :转储未经修改的实体:为什么?
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
}
}发布于 2015-05-11 09:01:08
DateTime毕竟是对象,并且总是通过引用传递。因此,我强烈建议您这样编辑代码:
$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();这样,就可以确保将不同的对象传递给实体,并避免EntityManager中的任何细微错误。
https://stackoverflow.com/questions/29594441
复制相似问题