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

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

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

我试过了:

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

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

【问题讨论】:

  • 推进还是教条?请明确说明。
  • 我在问如何在 Propel ORM 中做到这一点

标签: model symfony1 save propel


【解决方案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”目录中的类会自动受益于自动加载。您可以在官方文档中找到有关这些文件夹的更多信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2021-07-14
      相关资源
      最近更新 更多