Yii 2.0.48 中配置 TimestampBehavior 需正确声明行为、匹配字段类型并避开陷阱:字段名须与数据库列名一致且存在;整型用 time(),datetime 字段推荐 'value' => new Expression('NOW()');需在 rules() 中声明 safe,避免手动赋值覆盖,并建议通过 BaseModel 统一复用配置。

Yii 2.0.48 中配置 TimestampBehavior 自动生成时间戳,核心是正确声明行为、匹配字段类型、避开常见陷阱。它本身不依赖版本号差异(2.0.48 属于稳定分支),关键在写法严谨和上下文适配。
基础配置:最简可用写法
在你的 ActiveRecord 模型类中添加如下代码:
- 引入行为类:
use yii\behaviors\TimestampBehavior; - 重写
behaviors()方法,返回行为配置数组:
注意:字段名必须与数据库实际列名完全一致(如 created_at、updated_at),且该列需已存在。
默认用法(适用于整型 UNIX 时间戳):
public function behaviors()
{
return [
TimestampBehavior::className(),
];
}
此时行为会自动监听 beforeInsert 和 beforeUpdate 事件,为 created_at 和 updated_at 赋值 time() 返回的整数。
适配 datetime 字符串格式(MySQL 常见场景)
若数据库字段类型是 DATETIME 或 TIMESTAMP(如 '2026-10-21 07:09:00'),不能直接用 time(),需改用 SQL 表达式或闭包:
- 推荐方式(数据库生成,精度高、时区可控):
'value' => new \yii\db\Expression('NOW()') - PHP 生成方式(需注意时区):
'value' => function () { return date('Y-m-d H:i:s'); }
完整配置示例:
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => new \yii\db\Expression('NOW()'),
],
];
}
关键避坑点(2.0.48 实测易错项)
以下问题在 2.0.48 中高频出现,直接影响行为是否生效:
-
字段未声明为 safe:RESTful 接口或使用
$model->load()时,若created_at/updated_at不在rules()的safe列表里,它们不会被加载,行为无法触发。需补上:['created_at', 'updated_at', 'safe'] -
手动赋值覆盖行为:控制器中写了
$model->updated_at = time();,会跳过行为逻辑,导致更新时间不准或重复赋值 -
数据库字段类型不匹配:用
time()却建了DATETIME字段,或反之,会导致插入失败或存入 0 值 -
字段不存在却未处理:模型里没有
created_at属性(比如拼错成create_at),默认行为会报错;可改用改进版行为类,或提前用$this->hasAttribute()校验
进阶建议:统一基类复用
避免每个模型重复写 behavior 配置,可定义一个 BaseModel:
class BaseModel extends \yii\db\ActiveRecord
{
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => new \yii\db\Expression('NOW()'),
],
];
}
public function rules()
{
$rules = parent::rules();
$rules[] = ['created_at', 'safe'];
$rules[] = ['updated_at', 'safe'];
return $rules;
}
}
然后让各业务模型继承它即可,既简洁又可控。


















