Yii框架可通过禁用TimestampBehavior对created_at的自动处理来实现手动赋值,具体包括修改behaviors()配置移除EVENT_BEFORE_INSERT中的'created_at'、直接赋值时间戳/字符串/DateTime格式,或临时禁用行为;需确保赋值格式与数据库字段类型(TIMESTAMP/DATETIME/INT)兼容。

Yii框架默认通过 TimestampBehavior 自动填充 created_at,但有时业务需要手动控制该字段(比如导入历史数据、后台补录、测试场景等)。只要绕过行为的自动干预,就能安全赋值。
关闭 TimestampBehavior 对 created_at 的自动处理
在模型的 behaviors() 方法中,移除或注释掉对 created_at 的监听,只保留 updated_at:
- 将
\yii\db\ActiveRecord::EVENT_BEFORE_INSERT中的'created_at'删除 - 确保
'createdAtAttribute'仍设为'created_at'(不影响字段名映射,仅禁用自动写入) - 示例配置:
public function behaviors()
{
return [
[
'class' => \yii\behaviors\TimestampBehavior::class,
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'attributes' => [
\yii\db\ActiveRecord::EVENT_BEFORE_INSERT => ['updated_at'],
\yii\db\ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
'value' => new \yii\db\Expression('NOW()'),
],
];
}
直接赋值并保存
行为不再拦截后,可像普通属性一样赋值:
-
使用时间戳整数:
$model->created_at = time(); -
使用格式化字符串(需字段类型为
DATETIME):$model->created_at = '2025-03-18 10:22:30'; -
使用 DateTime 实例(Yii 不自动转换,需手动转字符串):
$model->created_at = (new \DateTime('2024-01-01'))->format('Y-m-d H:i:s');
临时跳过行为(不改配置)
若不想修改模型行为定义,可在实例层面临时禁用:
- 创建模型后立即设置:
$model->createdAtAttribute = null; - 或在保存前调用:
$model->detachBehavior('timestamp');(需先确保行为有命名) - 更稳妥的做法是:在
beforeSave()中判断是否已手动设值,跳过行为逻辑
注意数据库字段类型兼容性
手动赋值时,必须与数据库字段类型匹配:
-
TIMESTAMP字段通常接受'Y-m-d H:i:s'格式字符串或 UNIX 时间戳(MySQL 会自动转换) -
DATETIME字段只认字符串格式,不支持纯整数时间戳 - 若字段类型为
INT存时间戳,请统一用time()或strtotime()


















