在 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_at
或 updated_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_at 和 updated_at 列;它们会自动更新。
如果您想保留其他created_at 和updated_at 的信息,您应该创建另一个字段。
【讨论】:
有没有办法在需要时覆盖此行为?我不想仅仅为了一个行为而改变数据库结构和整个模型。 @Failpunk:默认情况下,存储在项目“lib”目录中的类会自动受益于自动加载。您可以在官方文档中找到有关这些文件夹的更多信息。以上是关于在 Symfony 中保存数据库时如何保留 updated_at 日期字段?的主要内容,如果未能解决你的问题,请参考以下文章
将重音字符 é 插入 Symfony2 中的表单时,如何在 mysql 数据库中将重音字符 é 保存为 é?
如何在 Symfony EasyAdmin 3 中创建数据验证系统