You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Eloquent默认timestamps()为何不使用DATETIME类型?如何保留自动更新功能

Laravel默认用TIMESTAMP而非DATETIME的原因及替代方案

为什么默认使用TIMESTAMP?

  • 历史兼容性:早期MySQL版本(5.6.5之前)里,DATETIME不支持自动初始化和更新(DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP),而TIMESTAMP天生支持这个特性。Laravel早期为适配广泛使用的旧版本MySQL,选择TIMESTAMP作为默认,这个习惯一直延续至今。
  • 存储空间优势:TIMESTAMP仅占4字节存储空间,DATETIME则需要8字节。对于数据量较大的表,长期能节省不少存储资源。
  • 时区自动转换:TIMESTAMP会自动按数据库时区存储和转换,读取时适配当前时区;早期DATETIME仅存储字面时间,时区处理需手动实现。虽现在MySQL的DATETIME也支持时区功能,但Laravel默认配置未做修改。

手动创建DATETIME类型时间戳并保留自动更新功能

有两种可靠实现方式:

方式一:数据库层面自动维护

在迁移文件中手动定义created_at和updated_at为DATETIME类型,同时配置默认值和自动更新规则:

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    // 手动创建DATETIME类型的时间戳字段
    $table->dateTime('created_at')->useCurrent();
    $table->dateTime('updated_at')->useCurrent()->useCurrentOnUpdate();
});

数据库会自动在插入记录时设置created_at,更新记录时刷新updated_at,同时Laravel模型能正常识别这两个字段,不影响框架的时间戳功能。

方式二:依赖Laravel框架自动填充

若不需要数据库层面的自动处理,只需在迁移中定义DATETIME字段,模型保持默认配置即可:

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->dateTime('created_at');
    $table->dateTime('updated_at');
});

模型中保留默认的public $timestamps = true;,Laravel会在调用save()、update()等方法时,自动为这两个字段填充当前时间。

内容的提问来源于stack exchange,提问作者Leander Hass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:52:23