yii中gii不直接支持unix时间戳字段,需手动在迁移中用integer(10)->unsigned()定义,并在beforesave()中用time()赋值,查询时避免对字段使用函数以保障索引效率。

在 Yii 框架中,Gii 生成迁移时默认不支持直接创建 Unix 时间戳类型字段(如 INT(10) 存储秒级时间戳),因为 MySQL 原生没有 UNIX_TIMESTAMP 类型,它只是整数。但你可以通过手动修改迁移文件,让 Gii 生成的迁移支持存储 Unix 时间戳的字段。
理解 Unix 时间戳字段的本质
Unix 时间戳是自 1970-01-01 00:00:00 UTC 起经过的秒数,典型用 INT(10) UNSIGNED 存储(范围够用到 2106 年)。Yii 的 ActiveRecord 默认使用 datetime 或 timestamp,但业务中常需存纯整数时间戳(比如兼容旧系统、避免时区转换、简化 JS 时间处理)。
在 Gii 迁移中定义 Unix 时间戳字段
Gii 的“Model Generator”或“CRUD Generator”本身不提供“Unix 时间戳字段”选项,但迁移生成器(Migration Generator)允许你手写字段定义。关键是在 up() 方法中用 $this->addColumn() 或 $this->createTable() 显式指定整数类型:
- 用
$this->integer(10)->unsigned()->notNull()表示秒级时间戳字段 - 若需毫秒级,可用
$this->bigInteger()->notNull() - 建议加注释说明用途,例如:
// UNIX timestamp (seconds since epoch), e.g. time()
自动填充 Unix 时间戳(插入/更新时)
数据库层无法像 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 那样自动填 Unix 时间戳,因为 MySQL 不内置该函数作为默认值(UNIX_TIMESTAMP() 是函数,不能直接作列默认)。所以需在 PHP 层控制:
- 在模型的
beforeSave()中赋值:$this->created_at = time();或$this->updated_at = time(); - 若用
ActiveRecord::EVENT_BEFORE_INSERT/EVENT_BEFORE_UPDATE行为,更清晰 - 注意时区:PHP 的
time()返回的是服务器本地时间对应的 Unix 时间戳(UTC 秒数),只要服务器时区设置合理(推荐设为 UTC),结果就是标准 Unix 时间戳
查询与格式化时的注意事项
读取后需手动转成可读时间(如显示给用户)或供前端使用:
- PHP 中:用
date('Y-m-d H:i:s', $model->created_at)或Yii::$app->formatter->asDatetime($model->created_at) - 数据库查询过滤:WHERE
created_at >= UNIX_TIMESTAMP('2024-01-01')(MySQL 端计算) - 避免在 WHERE 中用函数包裹字段(如
FROM_UNIXTIME(created_at) > '2024-01-01'),否则无法走索引











