表单提交后save()未插入数据的主因是模型验证失败且未检查返回值;需验证rules、scenarios、post字段命名是否匹配模型类名;新增后应通过$model->id而非$model->attributes['id']获取主键;批量插入优先用batchinsert()提升性能。

表单提交后调用 save() 为什么没插入数据
常见现象是:表单 POST 成功,$model->load() 返回 true,但 $model->save() 后查数据库发现没新增记录,甚至没报错。
根本原因通常是模型验证失败,而你没检查返回值或没输出错误。ActiveRecord 的 save() 默认会先执行 validate(),失败则直接返回 false,不写库也不抛异常。
- 务必检查
save()返回值:if (!$model->save()) { \Yii::error($model->errors); } - 开发期可在视图末尾加
= var_dump($model->errors) ?>快速定位字段级验证失败项 - 若模型有
scenarios或自定义rules(),确认当前场景(如'default')包含所需字段的规则
load() 不生效?看 POST 数据结构是否匹配命名规则
Yii 的 load() 依赖表单字段 name 属性严格匹配模型类名。例如模型是 User,字段必须为 User[username]、User[email],而不是 username 或 data[username]。
错误示例:<input name="username"> → $model->load($_POST) 无法识别,$model->username 保持空
正确写法(在视图中):
<?php $form = ActiveForm::begin(); ?>= $form->field($model, 'username')->textInput() ?>
= $form->field($model, 'email')->textInput() ?>
<?php ActiveForm::end(); ?>
这会自动生成符合规则的 name;手写 HTML 表单时,必须手动构造:<input name="User[username]">
新增成功但拿不到 ID?别直接读 attributes['id']
使用 save() 或 insert() 后,主键值不会自动填充到 $model->attributes 数组里(除非主键是自增且数据库驱动支持),更安全的做法是显式访问属性:
-
$model->save()成功后,直接用$model->id(假设主键属性名为id) -
$model->insert()成功后同理,$model->id已被赋值 - 避免
$model->attributes['id']—— 这个数组只包含显式设置过的属性,不自动同步主键值
如果模型主键不是 id(比如叫 user_id),请用对应属性名:$model->user_id。
批量插入不用模型?用 createCommand()->batchInsert() 更快
当一次要插几十条以上记录,且不需要逐条验证或事件触发(如 beforeSave),绕过 ActiveRecord 模型直接走 DAO,性能提升明显。
示例(插入用户列表):
Yii::$app->db->createCommand()->batchInsert('user', ['username', 'email'], [
['admin', 'admin@example.com'],
['test', 'test@example.com'],
])->execute();
注意:batchInsert() 不触发任何模型事件、不走验证、不处理时间戳自动填充(如 created_at),这些需在数据数组中手动提供。
如果必须保留模型逻辑(如自动加盐、格式化邮箱),仍应循环调用 new User() + save(),但要注意事务包裹和内存控制。
save() 返回 false,而开发者常默认“只要没异常就是成功”。











