推荐在 yii2.0.38 中通过重写 beforeinsert() 和 beforeupdate() 方法手动赋值 time() 生成 unix 时间戳,并确保 created_at、updated_at 字段为 int(11) 类型,移除或正确配置 timestampbehavior 以避免冲突。

在 Yii2.0.38 中,若需在模型保存前手动写入 Unix 时间戳(如 created_at、updated_at),推荐使用模型事件(如 beforeInsert、beforeUpdate)配合 time() 函数,而非依赖数据库自动填充或 ActiveRecord 的默认行为(因 2.0.38 版本对 timestamp 行为支持有限且易受时区影响)。
在模型中定义事件处理逻辑
在模型类(如 User.php)中重写对应事件方法,直接赋值整型 Unix 时间戳:
-
创建时写入:覆盖
beforeInsert(),设置$this->created_at = time(); -
更新时写入:覆盖
beforeUpdate(),设置$this->updated_at = time(); - 注意:两个方法都必须 返回 true,否则保存将被中断
确保数据库字段类型兼容
对应字段(如 created_at)应为 INT(11) 类型(非 DATETIME 或 TIMESTAMP),否则插入整数会报错或被截断。建表迁移示例:
public function up($migration)
{
$migration->createTable('{{%user}}', [
'id' => $this->primaryKey(),
'created_at' => $this->integer()->notNull(),
'updated_at' => $this->integer()->notNull(),
]);
}
避免与 TimestampBehavior 冲突
如果模型已配置 TimestampBehavior(如通过 behaviors() 方法),它默认会尝试用 date('U') 或 time() 填充,但可能因时区或配置导致非整型值。建议:
- 移除
TimestampBehavior配置,完全手动控制 - 若保留 Behavior,请显式指定
'value' => function() { return time(); }并确认'type' => Schema::TYPE_INTEGER - 检查是否启用了
'unixTimestamp' => true(该选项在较新版本才稳定,2.0.38 不建议依赖)
验证时间戳是否生效
保存后立即查出模型,检查字段值是否为 10 位整数(如 1717023456):
$model = new User(); $model->name = 'test'; $model->save(); var_dump($model->created_at); // 应输出 int(1717023456)
若得到 null 或字符串(如 "2024-05-30 10:23:45"),说明赋值未执行或字段类型不匹配,需回查事件方法是否被调用及数据库结构。











