【问题标题】:entitiy manager: persist doesn't work, no error messageentitymanager:persist 不起作用,没有错误消息
【发布时间】:2016-02-24 21:19:28
【问题描述】:

我在控制器中的一项操作有问题。我想更改一个对象的一个​​属性(小广告的发布日期)。

我从存储库中获得了一个特定的小广告,更改了属性的值,然后实体管理器应该保留该对象。这适用于其他一些属性,但不适用于日期 validTo

我现在的问题是,我没有收到任何错误消息。当我将每个步骤的值写入日志文件时,它具有正确的值。即使我在$em->flush() 方法之后通过$smallad->getValidTo() 获取属性(为了缩短我删除所有日志记录行的代码)。但是我没有在数据库中得到任何更改,并且该值没有持久化。

我使用这种动作控制器来更改一些其他控制器中的一些单个属性值,而不会出现任何问题。如果没有正确的错误消息,我不知道从哪里开始寻找解决方案。有什么想法吗?

public function extendAction($id)
{
    $repository = $this->getDoctrine()->getRepository('AppBundle:SmallAd');
    $smallad = $repository->findOneBy(array('id'=>$id));

    $em = $this->getDoctrine()->getManager();
    $date = $smallad->getValidTo()->modify('+31 days');
    $smallad->setValidTo($date);
    $em->persist($smallad);
    $em->flush();

    return new RedirectResponse($this->generateUrl('member'));
}

【问题讨论】:

  • 只是一个小提示 - 在这种情况下您不需要 persist(),因为您正在处理一个已经被管理的实体,因为您使用 findOneBy() 方法检索了它。您还可以使用$smalladd = $repository->find($id); 缩短您的findOneBy() 命令,只要您将$id 定义为实体上的主要Id 值。

标签: symfony doctrine-orm entitymanager


【解决方案1】:

Doctrine 2 使用对象引用来检测日期属性何时已更改,因此需要更新数据库:http://doctrine-orm.readthedocs.org/en/latest/cookbook/working-with-datetime.html

这有点违反直觉。您更新了日期,但保留了相同的日期对象,因此没有更改。通过克隆日期很容易修复:

$date = $smallad->getValidTo()->modify('+31 days');
$smallad->setValidTo(clone $date); 

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
相关资源
最近更新 更多