Yii 1.1.32需手动重写beforeSave()实现时间戳:新增时设created_at和updated_at,更新时仅设updated_at;须在rules()中声明字段为safe,并确保PHP赋值类型与数据库字段(INT或DATETIME)匹配。

Yii 1.1.32 中没有内置的 TimestampBehavior(那是 Yii 2+ 的特性),实现自动时间戳需手动在模型中重写 beforeSave() 方法,并确保字段可写、数据库类型匹配。
在模型中重写 beforeSave()
这是最常用且可靠的方式。Yii 1.1.32 的 ActiveRecord 在保存前会调用 beforeSave(),你可以在其中为时间字段赋值:
- 检查
$this->isNewRecord判断是新增还是更新 - 使用
time()赋 Unix 时间戳,或date('Y-m-d H:i:s')赋 datetime 字符串 - 确保字段名与数据库列名一致(如
created_at、updated_at)
示例代码:
public function beforeSave()
{
if (parent::beforeSave()) {
if ($this->isNewRecord) {
$this->created_at = time();
$this->updated_at = time();
} else {
$this->updated_at = time();
}
return true;
}
return false;
}
确保时间字段可被赋值
Yii 1.1.32 默认对未在 rules() 中声明的字段做安全过滤。若时间字段未出现在规则里,可能被 saveAttributes 或批量赋值跳过:
- 在模型的
rules()中添加对应字段为safe,例如:array('created_at, updated_at', 'safe') - 或确保你在调用
save()时未启用严格场景(如未指定scenario),避免字段被过滤 - 如果使用
$model->attributes = $_POST['Model']方式赋值,必须让时间字段在safe列表中,否则不会被加载
数据库字段类型要匹配
PHP 赋值类型需与数据库字段类型兼容:
- 若数据库字段是
INT(11),用time()或strtotime()赋整型时间戳 - 若字段是
DATETIME或TIMESTAMP,用date('Y-m-d H:i:s')赋字符串 - 不建议混用:比如往
DATETIME字段写time()整数,MySQL 可能转成'1970-01-01 08:00:00'这类错误值
可选:封装成行为(需自定义)
虽然 Yii 1.1.32 不带 TimestampBehavior,但你可以自己写一个轻量行为类,然后在模型中通过 behaviors() 绑定(需继承 CActiveRecord 并启用行为支持)。不过对多数项目,直接用 beforeSave() 更清晰、无依赖、易调试。


















