yii框架用gii生成模型时不会自动配置时间戳字段,需手动重写createdatattribute()/updatedatattribute()方法并在behaviors中添加timestampbehavior,同时确保数据库字段存在且命名规范、类型匹配及时区一致。

Yii 框架用 Gii 生成模型时,默认不会自动识别或配置时间戳字段(如 created_at、updated_at),需要手动适配才能让模型支持自动填充和更新。这不是 Gii 的缺陷,而是设计使然——它按数据库结构生成基础代码,业务逻辑(包括时间戳行为)需开发者显式声明。
确认数据库字段已存在并命名规范
确保数据表中已有 created_at 和/或 updated_at 字段,类型推荐为 INT(11)(Unix 时间戳)或 DATETIME(MySQL 原生时间)。Gii 能读取字段,但不会主动判断其用途;若字段名不标准(如叫 add_time 或 last_modify),Gii 更不会识别为时间戳。
- MySQL 中建议使用
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP配合DATETIME类型,便于数据库层兜底 - 若用
INT存秒级时间戳,注意 PHPtime()返回的是整数,直接赋值即可;毫秒级需除以 1000 并取整
在生成的模型中启用时间戳行为
Gii 生成的模型类(如 app\models\User)默认继承 yii\db\ActiveRecord,但不开启时间戳自动管理。需手动修改两个关键点:
- 重写
createdAtAttribute()和updatedAtAttribute()方法,明确指定字段名:
public function createdAtAttribute() { return 'created_at'; }
public function updatedAtAttribute() { return 'updated_at'; } - 在
behaviors()中添加TimestampBehavior:
'behaviors' => [
'timestamp' => [
'class' => \yii\behaviors\TimestampBehavior::class,
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => new \yii\db\Expression('NOW()'), // 用于 DATETIME
// 或 'value' => time(), // 用于 INT 秒级时间戳
],
],
处理不同时间类型与时区一致性
若数据库用 DATETIME,PHP 写入时应确保时区对齐;若用 INT,则更简单稳定。Yii 的 TimestampBehavior 默认用 time()(秒级),所以搭配 INT 字段最省心。
- 检查应用配置
timezone:在config/web.php或common/config/main.php中确认'timeZone' => 'Asia/Shanghai'已设置 - 避免混用:不要让数据库用
NOW()(本地时区)、PHP 用time()(UTC 或其他时区),否则显示偏差一整块 - 如需毫秒精度(少见),改用
ROUND(UNIX_TIMESTAMP(CURTIME(3)) * 1000)配合BIGINT字段,并自定义 behavior value
验证与调试小技巧
生成并修改后,别急着跑业务,先做两件事验证是否生效:
- 新建一条记录,检查
created_at是否自动写入(可临时加var_dump($model->created_at); die;在save()后) - 执行
$model->name = 'test'; $model->save();,再查数据库,确认updated_at是否变化 - 若不生效,重点检查 behavior 是否被覆盖(比如父类已有 behaviors 定义却没合并)、字段名拼写是否大小写一致(尤其 PostgreSQL 区分大小写)











