首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原则持久化实体在实体管理器->持久化和单位持久化->持久化

原则持久化实体在实体管理器->持久化和单位持久化->持久化
EN

Stack Overflow用户
提问于 2015-04-12 20:43:41
回答 1查看 2.7K关注 0票数 6

在我的symfony2 2/ modified 2应用程序中,我遇到了一个奇怪的情况:当持久化修改的实体时,更改不会被刷新到数据库中,而且我也不明白为什么。

下面是我的代码:

代码语言:javascript
复制
$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的输出如下:

代码语言:javascript
复制
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:转储更新的实体

代码语言:javascript
复制
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 :转储未经修改的实体:为什么?

代码语言:javascript
复制
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
        }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-11 09:01:08

DateTime毕竟是对象,并且总是通过引用传递。因此,我强烈建议您这样编辑代码:

代码语言:javascript
复制
$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中的任何细微错误。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29594441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档