时间戳行为允许您的表对象在每个模型事件上更新一个或多个时间戳。 这主要用于将数据填充到 created
和 modified
字段中。 但是,通过一些额外的配置,您可以在表发布的任何事件上更新任何时间戳/日期时间列。
您可以像任何其他行为一样启用时间戳行为
class ArticlesTable extends Table
{
public function initialize(array $config): void
{
$this->addBehavior('Timestamp');
}
}
默认配置将执行以下操作
当保存新实体时,created
和 modified
字段将设置为当前时间。
当更新实体时,modified
字段设置为当前时间。
如果您需要修改具有不同名称的字段,或者希望在自定义事件上更新其他时间戳字段,您可以使用一些额外的配置
class OrdersTable extends Table
{
public function initialize(array $config): void
{
$this->addBehavior('Timestamp', [
'events' => [
'Model.beforeSave' => [
'created_at' => 'new',
'updated_at' => 'always',
],
'Orders.completed' => [
'completed_at' => 'always'
]
]
]);
}
}
如上所示,除了标准的 Model.beforeSave
事件之外,我们还在订单完成时更新 completed_at
列。
有时您可能希望仅更新实体上的时间戳,而不更改任何其他属性。 这有时被称为“触碰”记录。 在 CakePHP 中,您可以使用 touch()
方法来实现此目的
// Touch based on the Model.beforeSave event.
$articles->touch($article);
// Touch based on a specific event.
$orders->touch($order, 'Orders.completed');
保存实体后,字段将更新。
触碰记录在您希望在创建/更新子资源时发出父资源已更改的信号时非常有用。 例如:在添加新评论时更新文章。
要禁用在保存实体时自动修改 updated
时间戳列,您可以将属性标记为“脏”
// Mark the modified column as dirty making
// the current value be set on update.
$order->setDirty('modified', true);