Yii 1.1.25 中 CTimestampBehavior 不生效的主因是行为未正确挂载、字段映射不匹配或被 beforeSave() 覆盖;需确认 behaviors() 返回关联数组、类名大小写准确、显式配置 createAttribute/updateAttribute,且数据库字段为 INT(10) UNSIGNED 并允许 NULL 或设默认值。

确认行为是否正确挂载
检查模型类中 behaviors() 方法返回数组是否包含 CTimestampBehavior,且键名不冲突:
- 必须返回关联数组,不能是索引数组;例如:
return array('timestamp' => array(...)),不能写成return array(array(...)) - 确保行为类名拼写准确:
'class'=>'CTimestampBehavior',注意大小写(Yii 1.1 区分大小写) - 检查是否被其他行为或重写的
beforeSave()方法覆盖——若模型里手动写了beforeSave()却没调用parent::beforeSave(),时间戳行为将完全失效
验证字段映射与数据库约束
行为依赖字段名约定或显式配置,常见断点在此:
- 默认只识别
create_time和update_time字段。若你用的是created_at、updated_at,必须显式配置:'createAttribute' => 'created_at', 'updateAttribute' => 'updated_at' - 数据库字段类型要匹配:推荐使用
INT(10) UNSIGNED存时间戳;若用了DATETIME类型,行为不会自动转换,需配合CDateFormatter或自定义逻辑 - 检查字段是否允许
NULL:若设为NOT NULL且无默认值,而行为又未触发写入,插入会因 MySQL 严格模式报错或静默填 0
检查触发时机与模型状态
该行为仅在 insert() 和 update() 时生效,且受模型场景(scenario)和验证影响:
- 确认当前操作是
$model->save(),而非直接执行 SQL 或使用updateAll()/insert()静态方法——这些绕过 AR 生命周期,行为不触发 - 若设置了
$model->scenario,确保该场景下对应字段在rules()中未被设为'safe'=>false或排除在验证之外,否则可能被过滤掉 - 调试时可在行为的
onBeforeSave回调里加日志,或临时在行为源码CTimestampBehavior.php的beforeSave()方法开头加Yii::log(),确认是否进入
留意 Yii 1.1.25 特定补丁与兼容性
1.1.25 是 Yii 1.x 后期稳定版,但存在几个已知细节问题:
- 若模型继承自非标准基类(如自定义了
CActiveRecord子类并重写了save()),需确认是否保留了onBeforeSave事件触发逻辑 - 部分环境启用
E_STRICT报错时,行为中对$owner->isNewRecord的访问可能因属性未声明而警告,导致后续逻辑跳过(可临时关闭错误报告验证) - 确保
protected $timestamps = true;这类自定义属性未与行为冲突——Yii 1.1 原生不识别该写法,纯属干扰项


















