字段不存在错误源于AR模型与数据库表结构不一致或字段名拼写错误,需检查rules()、scenarios()、attributes()是否包含该字段,确认数据库真实存在且命名风格匹配,并验证迁移是否已执行。

字段不存在错误不是数据库没建好,而是 ActiveRecord 模型和数据库表结构不一致,或者字段名写错了。
检查 rules() 和 attributes() 是否包含该字段
新增数据时触发的验证逻辑依赖 rules() 定义,如果字段没在 rules() 里声明,又没设为 safe,就会被过滤掉,后续赋值或批量赋值(load()、create())时直接忽略,但更常见的是——字段压根没出现在模型的可写属性列表中。
-
load()默认只接受rules()中定义为safe的字段,或显式在scenarios()中加入该字段 - 若字段是数据库列但未在
rules()中出现,又没加到scenarios('default'),load()后该字段值不会被设入模型 - 手动赋值如
$model->new_field = 'xxx'是允许的,但保存时若该字段不在attributes()返回值中(比如没被getTableSchema()识别),会抛出Unknown Property异常
确认数据库表真有这个字段,且大小写/下划线匹配
MySQL 不区分大小写,但 PostgreSQL 和 SQL Server 区分;Yii 通过 getTableSchema() 反射字段名,若数据库里是 created_at,代码里写成 createdAt(驼峰)且没配 columnSchemaClass 或 attributeMap,就会报字段不存在。
- 执行
SHOW COLUMNS FROM your_table;确认字段名拼写、下划线风格是否一致 - 检查迁移文件是否已执行:
php yii migrate/status,未执行的迁移不会创建字段 - 若用
yii\db\Schema::TYPE_JSON等新类型,老版本 MySQL(getTableSchema() 解析失败,字段“消失”
排查 behaviors() 或第三方行为是否干扰属性映射
有些行为(如 TimestampBehavior、BlameableBehavior)会动态注入属性,但如果配置了错误的 createdAtAttribute 值(比如写成 'createdat' 而不是 'created_at'),会导致该字段在模型初始化时被注册为非法属性,后续任何对该字段的读写都会触发 Unknown Property。
- 搜索模型中所有
behaviors()返回数组,检查每个行为的*Attribute配置项是否与数据库列名完全一致 - 临时注释掉 behaviors,看错误是否消失,可快速定位是否是行为导致
- 注意:行为注入的字段不会出现在
getTableSchema()中,但必须能被 Yii 的魔术方法识别,否则仍会报错
最易被忽略的是迁移执行后没清缓存 —— Yii2 默认启用 schema 缓存,改了表结构但 runtime/cache/ 里还存着旧的字段列表,getTableSchema() 就永远看不到新字段。删掉 runtime/cache/ 下所有文件,再试一次。


















