yii2.0.30的timestampbehavior默认自动区分插入和更新:新增时填created_at与updated_at,更新时仅改updated_at;支持自定义字段名、事件映射及数据库生成时间值。

Yii2.0.30 中的 TimestampBehavior 默认就能区分插入和更新场景,自动填充不同字段——关键在于配置好触发时机和对应属性,而不是靠手动判断。
默认行为已满足基本区分
只要模型中正确声明行为,且数据库字段存在,它会自动:
- 在 新增记录(INSERT)时,同时写入
created_at和updated_at - 在 更新记录(UPDATE)时,只更新
updated_at,不碰created_at
这是开箱即用的行为,无需额外代码。前提是字段名匹配默认值(created_at/updated_at),且模型继承自 ActiveRecord。
按需自定义字段名和事件映射
如果数据库字段名不同(比如叫 add_time、edit_time),必须显式指定:
-
createdAtAttribute:指定插入时要填的字段(如'add_time') -
updatedAtAttribute:指定更新时要填的字段(如'edit_time') -
attributes:精细控制哪个事件触发哪些字段(更灵活,推荐)
示例配置:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'add_time',
'updatedAtAttribute' => 'edit_time',
// 或者用 attributes 更明确地绑定
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['add_time', 'edit_time'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['edit_time'],
],
],
];
}
时间值来源:PHP 还是数据库?
默认用 PHP 的 time()(返回 UNIX 时间戳),适合字段类型为 INT;若字段是 DATETIME 或 TIMESTAMP 类型,建议交由数据库生成:
- MySQL:用
new Expression('NOW()') - PostgreSQL:用
new Expression('CURRENT_TIMESTAMP')
这样能规避服务器时区/时间不准的问题,也更符合数据库层面的一致性要求。
字段类型与验证注意事项
时间戳字段不应出现在 rules() 中:
- 因为值由行为自动设置,用户不输入也不应校验
- 数据库字段建议设为
INT(存 UNIX 时间戳)或DATETIME(配合Expression) - 避免给字段设默认值(如
DEFAULT CURRENT_TIMESTAMP),否则行为可能被绕过











