created_at 和 updated_at 未自动写入的根本原因是四个前提条件未同时满足:表中缺少对应字段、模型禁用了时间戳、未继承 Eloquent Model 或绕过了 Eloquent 操作;自定义字段名需声明 public 常量 CREATED_AT/UPDATED_AT,禁用则设 $timestamps = false;手动赋值需临时关闭自动维护并注意时间格式与数据库类型选择(推荐 DATETIME)。

默认开启自动维护,但必须满足四个前提条件,缺一不可;否则字段会为空或报错。
为什么 created_at 和 updated_at 没有被自动写入?
常见现象是插入记录后这两个字段为 NULL,或抛出 SQLSTATE[HY000]: General error: 1364 Field 'created_at' doesn't have a default value 错误。
根本原因不是 Laravel 关闭了功能,而是以下任一条件未满足:
- 数据库表中必须存在
created_at和updated_at字段(类型建议为TIMESTAMP或DATETIME) - 模型类中未将
$timestamps显式设为false - 模型未继承
Illuminate\Database\Eloquent\Model(比如手动写了构造函数却忘了调用parent::__construct()) - 执行插入时用了原生 SQL、
DB::insert()或Model::unguarded()等绕过 Eloquent 的方式
如何自定义时间戳字段名或禁用自动维护?
适用于需要兼容旧表结构(如字段叫 add_time)、或只需维护其中一个字段的场景。
在模型中直接声明对应属性即可:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
class Post extends Model
{
// 禁用时间戳(完全不处理)
public $timestamps = false;
// 自定义字段名
const CREATED_AT = 'add_time';
const UPDATED_AT = 'edit_time';
// 只维护 created_at,不自动更新 updated_at
public $touches = [];
}
注意:const CREATED_AT/UPDATED_AT 必须是 public 常量,且不能加 $;改名后迁移文件和数据库字段也需同步调整。
手动设置时间戳值时要注意什么?
当需要精确控制时间(例如导入历史数据、模拟过去时间),可临时关闭自动维护再赋值:
- 用
$model->timestamps = false临时关闭,然后直接赋值$model->created_at = '2020-01-01 12:00:00' - 调用
save()前记得恢复:$model->timestamps = true,否则后续更新不会刷新updated_at - 更安全的做法是使用
updateQuietly()(Laravel 9+)或withoutTimestamps()(Laravel 10+)包裹操作 - 时间格式必须符合 MySQL 要求(
Y-m-d H:i:s),PHP 的DateTime对象会被自动转换,但字符串不能含毫秒或时区偏移(如2020-01-01T12:00:00+08:00会失败)
数据库层面的陷阱:TIMESTAMP vs DATETIME
MySQL 中两者行为差异直接影响 Laravel 时间戳表现:
-
TIMESTAMP默认带ON UPDATE CURRENT_TIMESTAMP,会导致数据库自行覆盖updated_at,与 Laravel 冲突(尤其在批量更新或触发器场景下) -
DATETIME更可控,推荐在迁移中显式指定:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->timestamps(); // 默认生成 DATETIME 类型(Laravel 8.35+)
// 如需兼容老版本或明确控制,可写:
$table->dateTime('created_at')->nullable();
$table->dateTime('updated_at')->nullable();
});
如果已有表用了 TIMESTAMP 且启用了自动更新,务必在迁移中移除 ON UPDATE 行为,否则 Laravel 写入的 updated_at 可能被数据库瞬间覆盖。










