Yii2.0.45中TimestampBehavior需正确配置value属性并匹配字段类型:PHP用time()配INT字段,NOW()配DATETIME,date()配DATETIME/TIMESTAMP;须显式声明attributes事件映射,且rules中排除时间戳字段。

Yii2.0.45 中的 TimestampBehavior 支持灵活自定义时间戳值,关键在于正确配置 value 属性,并匹配数据库字段类型与生成方式。
明确 value 的三种常用写法
value 决定时间戳怎么算、谁来算。它不是固定字符串,而是一个可调用值(callback)、表达式(Expression)或常量:
-
PHP 生成 UNIX 时间戳:用
function () { return time(); }—— 适合INT(11)字段,时区由 PHP 配置控制 -
数据库生成 DATETIME:用
new \yii\db\Expression('NOW()')—— MySQL 推荐,避免服务器时间偏差;PostgreSQL 请用CURRENT_TIMESTAMP -
自定义格式字符串:如
function () { return date('Y-m-d H:i:s'); }—— 要求字段为DATETIME或TIMESTAMP类型
字段类型必须和 value 匹配
数据库列定义不匹配会导致插入失败或存入错误值:
- 若用
time()或date()回调 → 字段应为INT(如INT(11) UNSIGNED),不能是TIMESTAMP(MySQL 的TIMESTAMP有自动更新逻辑,易冲突) - 若用
NOW()表达式 → 字段建议为DATETIME(兼容性好),TIMESTAMP也可但需注意 MySQL 版本限制(5.6+ 才支持NOW()作默认值) - 字段上不要设
DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP—— 否则行为可能被跳过,造成时间不一致
指定字段名和事件时机
默认只认 created_at 和 updated_at,实际项目中字段名常不同。完整配置示例如下:
public function behaviors()
{
return [
[
'class' => \yii\behaviors\TimestampBehavior::className(),
'createdAtAttribute' => 'create_time',
'updatedAtAttribute' => 'update_time',
'value' => new \yii\db\Expression('NOW()'),
'attributes' => [
\yii\db\ActiveRecord::EVENT_BEFORE_INSERT => ['create_time', 'update_time'],
\yii\db\ActiveRecord::EVENT_BEFORE_UPDATE => ['update_time'],
],
],
];
}
注意:attributes 数组显式声明了哪些事件触发哪些字段,比仅靠 createdAtAttribute 更可控,也避免因字段不存在导致报错。
模型规则里要排除时间戳字段
因为值由行为自动填充,用户不输入、也不应验证:
- 确保
rules()方法中不出现created_at、updated_at或你自定义的字段名(如create_time) - 如果这些字段出现在
safe或required规则里,会导致验证失败或被覆盖 - 必要时可在
scenarios()中移除它们,例如:return array_merge(parent::scenarios(), ['default' => ['id', 'name']]);


















