
在 yii2-advanced 项目中,为模型新增数据库字段后出现 “getting unknown property” 错误,通常是因启用的数据库 schema 缓存未及时更新所致;执行 `yii::$app->cache->flush()` 可强制清除缓存并使新字段生效。
当您在数据库表中已成功添加 TNI_NUMBER 字段,并同步更新了模型的验证规则(如将 'TNI_NUMBER' 加入 integer 规则),却仍收到类似 Getting unknown property: app\models\YourModel::TNI_NUMBER 的错误时,根本原因并非代码逻辑或数据类型不匹配,而是 Yii2 的 Schema 缓存机制在作祟。
Yii2 在启用 'enableSchemaCache' => true(通常配置于 common/config/main-local.php 的 db 组件中)时,会将数据库表结构(包括字段名、类型、主键等)缓存至应用缓存(如文件缓存、Redis 或 APCu)。该缓存不会自动感知数据库 DDL 变更(如 ALTER TABLE ADD COLUMN),因此模型在构建 ActiveRecord 属性映射时,仍沿用旧的 Schema 快照——导致 TNI_NUMBER 被视为“不存在的属性”。
✅ 正确解决方案(临时且高效):
在控制器动作中、实例化模型前,手动刷新应用缓存:
public function actionCreate()
{
Yii::$app->cache->flush(); // ← 关键:强制清空全部缓存项(含 Schema 缓存)
$model = new YourModel();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('create', ['model' => $model]);
}⚠️ 重要注意事项:
- Yii::$app->cache->flush() 是全局清空操作,会删除所有写入该缓存组件的数据(如页面缓存、查询缓存、配置缓存等),仅建议在开发阶段或部署后首次调试时使用;
- 切勿保留在生产环境代码中——应在确认模型正常工作后立即注释或删除该行;
- 更规范的长期方案是:在执行数据库迁移(migration)后,通过命令行刷新 Schema 缓存:
php yii cache/flush-schema
(需确保 yii 控制台应用已正确配置缓存组件);
- 若使用 Redis 等外部缓存,也可直接清空对应缓存库(如 redis-cli FLUSHDB),但需注意影响范围。
总结:新增字段后报“unknown property”,本质是 Schema 元信息滞后。flush() 是快速验证问题的黄金钥匙,而建立“迁移 → 刷新 Schema 缓存”的标准化流程,才是保障 Yii2 应用健壮性的工程实践。










