返回

如何使用 Laravel 迁移设置时间戳列的默认值为当前时间戳?

php

使用 Laravel 迁移设置时间戳列的默认值为当前时间戳

时间戳列是数据库中一个常见的元素,用于记录数据的创建和更新时间。Laravel 提供了一个简单的方法来定义这些列,但默认情况下,它们的值会被设置为 0000-00-00 00:00:00。本文将探讨如何使用 Laravel 迁移来设置时间戳列的默认值为当前时间戳,以及如何使用 CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 约束来实现自动更新。

设置时间戳列的默认值

第一步是创建一个新的迁移来定义具有所需默认值的时间戳列。为此,我们需要使用 DB::raw() 表达式来设置默认值。

CURRENT_TIMESTAMP 函数返回当前时间戳,而 ON UPDATE CURRENT_TIMESTAMP 约束确保在更新记录时时间戳将自动更新为当前时间戳。

代码示例:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->nullable();
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))->nullable();

应用迁移

使用以下 Artisan 命令应用迁移:

php artisan migrate

结果

现在,表将包含两个时间戳列:created_atupdated_atcreated_at 列将被自动设置为插入记录时的当前时间戳,而 updated_at 列将在更新记录时被自动更新为当前时间戳。

使用示例

以下是使用此设置插入和更新记录的示例:

// 插入记录
$post = new Post;
$post->title = 'My Post';
$post->save();

// 更新记录
$post->title = 'Updated Post';
$post->save();

常见问题解答

1. 如何禁用自动更新时间戳?

要禁用自动更新时间戳,可以在模型中使用 timestamps = false 属性。

2. 如何更改时间戳列的名称?

可以通过覆盖 getCreatedAtColumngetUpdatedAtColumn 方法来更改时间戳列的名称。

3. 如何为不同的表使用不同的时间戳列?

可以为每个表创建自定义迁移来设置时间戳列。

4. 如何为时间戳列添加索引?

可以在迁移中使用 index() 方法为时间戳列添加索引。

5. 如何处理时区问题?

Laravel 会自动处理时区,因此无需进行任何特殊配置。

结论

使用 Laravel 迁移设置时间戳列的默认值为当前时间戳是一个简单且有用的技术,它可以帮助你保持数据库记录的时间戳的准确性和最新性。通过使用 CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 约束,你可以确保时间戳始终是最新的,从而简化了数据库记录的自动时间戳处理。