我在控制器中遇到了一个问题。我想更改对象的一个属性(发布小广告的日期)。
我从存储库中获取特定的小广告,更改属性的值,而实体管理器应该保留该对象。这适用于其他一些属性,但不适用于日期validTo
。
我现在的问题是,我没有收到任何错误消息。当我将每个步骤的值写入日志文件时,它具有正确的值。即使我在$smallad->getValidTo()
方法之后通过$em->flush()
获取属性(为了缩短代码,我删除了所有日志记录行)。但是我没有在数据库中得到任何更改,并且值不会持久存在。
我使用这种动作控制器来改变一些其他控制器中的一些属性值而没有任何问题。如果没有正确的错误消息,我不知道从哪里开始寻找解决方案。有什么想法吗?
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'));
}
答案 0 :(得分:4)
Doctrine 2使用对象引用来检测何时更改了date属性,因此需要更新数据库:http://doctrine-orm.readthedocs.org/en/latest/cookbook/working-with-datetime.html
这有点反直觉。您更新了日期,但保留了相同的日期对象,因此没有更改。通过克隆日期很容易修复:
$date = $smallad->getValidTo()->modify('+31 days');
$smallad->setValidTo(clone $date);