2009-09-13 71 views
0

这必须很简单... 我试图保留当前日期已存储在DB中的updated_at字段。
我正在更新同一行中的单个字段值,然后保存,但我不希望它更新updated_at字段。 我想保留现有的updated_at值。在Symfony中保存数据库时,如何保留updated_at日期字段?

我只想在一个,也许两种情况下做到这一点,所以我不需要覆盖程序中的其他任何动作的模型。

我已经试过这样:

$originalDate = $this->getUpdatedAt(); 
$this->setUpdatedAt($originalDate); 
$this->save(); 

这似乎是它应该工作,但它仍然看起来更新的领域。

+0

推动还是学说?请明确指出。 – develop7 2010-03-29 10:46:29

+0

我在问如何在Propel ORM中执行此操作 – Failpunk 2010-04-30 00:32:41

回答

0

在symfony中,通常当一个表有一列名为created_at时,它被用来存储记录创建日期的时间戳。 updated_at列同样适用于每次更新记录本身时将其更新为当前时间值的列。

好消息是,symfony会识别这些列的名称并处理它们的更新。您不需要手动设置created_atupdated_at列;他们会自动更新。

如果要保留其他信息created_atupdated_at您应该创建另一个字段。

+0

有没有办法在需要时覆盖此行为?我不想只为一个行为改变数据库结构和整个模型。 – Failpunk 2009-09-13 23:04:22

+0

@Failpunk:默认情况下,存储在项目的“lib”目录中的类会自动从自动加载中受益。您可以在官方文档中找到有关这些文件夹的更多信息。 – ranonE 2009-09-14 07:29:52

1

那么看来这个微小变化的工作原理:

$originalDate = $this->getUpdatedAt(); 
$this->save(); 

$this->setUpdatedAt($originalDate); 
$this->save(); 

但必须有一个更优雅的方式,这样你就不必做两个独立的扑救。

3

仅当updated_at列的列未被更改时才会被设置为当前时间。这是用isColumnModified方法检查的。如果您首先将其更改为某个值,然后将其更改回原始值,则可以欺骗该对象以相信这已被修改。

$updatedAt = $book->getUpdatedAt(); 
$book->setUpdatedAt(null); 
$book->setUpdatedAt($updatedAt); 

$book->setInStock(4); 
$book->save(); 

在Symfony的1.2,此行为在SfObjectBuilder::addSave()加入,并且不能被禁止(它检查名为updated_atupdated_on列)。在Symfony 1.3和1.4中,使用了Propel 1.4的更新行为,所以我认为你必须明确地添加它们才能获得效果。同样的技巧可以绕过更新。

相关问题