在 Symfony 中保存数据库时如何保留 updated_at 日期字段?

Posted

技术标签:

【中文标题】在 Symfony 中保存数据库时如何保留 updated_at 日期字段?【英文标题】:How do you preserve the updated_at date field when saving the the database in Symfony? 【发布时间】:2009-09-13 10:03:58 【问题描述】:

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

我只想在一种情况下执行此操作,也许是两种情况,因此我不需要为程序中的所有其他操作覆盖模型。

我试过了:

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

这似乎应该可以工作,但它似乎仍在更新该字段。

【问题讨论】:

推进还是教条?请明确说明。 我在问如何在 Propel ORM 中做到这一点 【参考方案1】:

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 的较新行为,因此我认为您必须显式添加它们才能获得效果。同样的技巧可以规避更新。

【讨论】:

【参考方案2】:

嗯,这个微小的变化似乎有效:

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

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

但必须有一种更优雅的方式,这样您就不必进行两次单独的保存。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

有没有办法在需要时覆盖此行为?我不想仅仅为了一个行为而改变数据库结构和整个模型。 @Failpunk:默认情况下,存储在项目“lib”目录中的类会自动受益于自动加载。您可以在官方文档中找到有关这些文件夹的更多信息。

以上是关于在 Symfony 中保存数据库时如何保留 updated_at 日期字段?的主要内容,如果未能解决你的问题,请参考以下文章

将重音字符 é 插入 Symfony2 中的表单时,如何在 mysql 数据库中将重音字符 é 保存为 é?

如何在 Symfony EasyAdmin 3 中创建数据验证系统

Symfony2/Doctrine:如何从实体类中持久化一个实体?

如何在 Symfony2 中保存视图中的数据

Symfony,如何显示对象的正常名称而不是实体编号

symfony 表单保存数据的问题