模型新增数据不入库主因是yii四层机制断链:未调用load()或忽略其返回值、新增字段未在rules中设safe、场景白名单缺失、schema缓存未刷新;任一环断裂均导致数据静默丢失。

模型新增数据不入库,大概率不是数据库或 SQL 问题,而是 Yii 的数据加载、验证、场景、字段安全四层机制有一环没对上。
load() 没调用或返回 false 却没检查
这是最常见也最容易被忽略的根源:你写了 $model->validate(),但根本没让数据进模型。
- 必须显式调用
$model->load($request->post())或$model->load($request->getBodyParams(), '');只写validate()是无效的 - 表单字段名默认带模型前缀(如
user[username]),若前端发的是扁平结构{"username":"a"},必须传空字符串:$model->load($data, '') - JSON 请求(
Content-Type: application/json)Yii 不自动解析,得手动:$raw = $request->getRawBody(); $data = Json::decode($raw); $model->load($data, '') -
load()返回false表示无匹配字段(比如字段名拼错、未定义在rules中),但你不判断就直接validate(),结果永远“通过”
新增字段没加进 rules 或没设为 safe
Yii 默认只接受 rules() 中声明为 'safe' 或有验证规则的字段——哪怕数据库里已有该字段,模型也不认。
- 新增字段后,必须在
rules()中补一条:['new_field', 'safe']或具体规则如['new_field', 'string', 'max' => 100] - 如果用了场景(
scenario),还要确认该字段出现在scenarios()返回的白名单里,例如:'create' => ['name', 'email', 'new_field'] - 不加
'safe'且无其他规则,load()会跳过该字段,save()自然不会写入
Schema 缓存没刷新,模型“看不见”新字段
Yii 会缓存数据库表结构(schema),加了字段但没刷新,模型仍按旧结构读取元信息,导致 unknown property 错误或字段被静默丢弃。
- 开发阶段快速验证:在控制器动作开头加
Yii::$app->db->getSchema()->refresh()(别留到线上) - 更规范的做法是迁移后执行命令:
php yii cache/flush-schema - 若用 Redis 缓存,也可直接
redis-cli FLUSHDB,但注意影响范围 - 极端情况可删
runtime/cache/下相关文件,但不如上面两种精准
save() 成功但数据没进库?检查主键和时间戳逻辑
看起来 $model->save() 返回 true,但查库发现没数据——常因主键冲突、自动填充字段异常或事务未提交。
- 确认主键是否设为
AUTO_INCREMENT,且模型没手动赋值(如$model->id = 0)导致 INSERT 变成 UPDATE - 检查
createdAt、updatedAt等自动字段是否在rules()中设为'safe',否则load()不会接收,beforeSave()里又没补全 - 若在事务中操作,确保最终调用了
$transaction->commit();没 commit 就 return,数据就卡在事务里 - 开启日志(
'log' => ['targets' => [['class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning', 'info']]]]),看 SQL 日志里实际执行的是 INSERT 还是 UPDATE
真正卡住人的地方,往往不是某一行代码写错了,而是四个环节——load()、rules、schema、save() 之间的配合断开了。尤其新增字段后,容易只改数据库、不动模型规则,再忘了清缓存,三重保险全失效。











