我想更新一个实体,但还要保留其现有的时间戳。换句话说,在大多数情况下,我希望此MySQL时间戳自动执行其设计的工作,但在某些情况下,我想作弊-潜入更新而无需更改此最后修改列。当然,使用SQL手动执行此操作很容易:
UPDATE events SET admin_notes = "foo", lastmod = lastmod WHERE /*...*/
但是我不知道如何让教义做到这一点。
实体被调用Application\Entity\Event
,列/注释看起来像:
/**
* @ORM\Column(name="lastmod",type="datetime")
* @var \DateTime
*/
protected $modified;
相关表中的基础表定义:
lastmod timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
因此,我得到一个Event
尝试,例如
$timestamp = $event->getModified();
echo "existing timestamp is: ".$timestamp->format('Y-m-d H:i:s')."\n";
//2016-06-07 10:13:15
$event
->setAdminNotes("this is an update at ".date('Y-m-d H:i:s'))
->setModified($timestamp);
$em->flush();
这是行不通的。内存中实体对象中的时间戳是“正确的”,即未更改,但是在实际数据库中,它被设置为当前日期时间,好像没有听到我说的那样。当然,查看SQL日志就是这种情况。My$event->setModified($timestamp)
不会将其放入生成的SQL语句中。
是的,我意识到我可以将表的数据类型更改为MySQL日期时间,并在整个应用程序中手动进行处理。现在没有选择。
为了论证,我尝试Doctrine\DBAL\Connection
从实体管理器获取并运行executeUpdate($SQL)
自己,然后(从SQL日志中)发现,如果我之前这样做flush()
,它将被忽略。因此,目前唯一可行的方法非常丑陋:将旧时间戳记保存在变量中,执行一次flush()
,然后运行另一个UPDATE手动将其设置回之前的状态。
有什么建议?
主义认为您没有修改$ timestamp对象,这就是为什么它不包含在sql查询中。尝试
$newTimestamp = clone $timestamp;
$event->setModified($newTimestamp);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句