thinkphp5.1新增数据分模型和db两类:模型触发修改器、事件等逻辑,适合业务约束场景;db直写更轻量,适合无逻辑快速插入;均需字段过滤、事务保障与安全处理。

ThinkPHP5.1 提供了模型层和数据库原生操作两种新增数据方式,核心区别在于:模型新增会触发修改器、自动完成、事件钩子等逻辑;而 Db 类新增是直接写入,更轻量、更可控。
模型方式新增单条数据
推荐用于有业务逻辑约束的场景(如字段自动处理、权限校验、日志记录等):
- 实例化后赋值再保存:$user = new User(); $user->name = '张三'; $user->email = 'zhangsan@example.com'; $user->save();
- 构造时传参再保存:$user = new User(['name' => '李四', 'email' => 'lisi@example.com']); $user->save();(注意:此方式跳过修改器)
- 批量赋值保存:$user = new User(); $user->save($_POST);,但必须配合 allowField() 或 Request::only() 过滤字段,防止非法字段注入
- 获取自增ID:$user->save(); echo $user->id;(主键名非 id 时,改用对应属性名,如 $user->user_id)
- 启用 REPLACE 模式(V5.1.14+):$user->replace()->save();,适用于存在唯一索引冲突时覆盖写入
Db 类方式新增单条数据
适合快速、无额外逻辑的写入,例如日志记录、缓存同步、后台脚本等:
- 基础 insert:Db::name('user')->insert(['name' => '王五', 'email' => 'wangwu@example.com']);,成功返回 1
- 带 data() 链式调用:Db::name('user')->data($data)->insert();
- 插入并返回自增ID:$id = Db::name('user')->insertGetId($data);(最常用)
- 严格模式控制:默认字段不存在会抛异常;设为非严格可忽略非法字段:Db::name('user')->strict(false)->insert($data);
- MySQL 下支持 REPLACE:Db::name('user')->insert($data, true);
批量新增数据
提升性能,避免循环 save/insert,尤其适用于导入、同步类操作:
- 模型批量新增:$user = new User(); $list = [['name'=>'A'], ['name'=>'B']]; $user->saveAll($list);
- Db 批量新增:Db::name('user')->insertAll($list);,成功返回插入条数
- 分批插入(大数据量防超时):Db::name('user')->data($list)->limit(500)->insertAll();
- 批量 REPLACE(MySQL):Db::name('user')->insertAll($list, true);
安全与最佳实践
新增操作看似简单,但字段过滤、类型校验、事务包裹常被忽略:
- 永远不要直接将 $_POST 全量传给 save() 或 insert(),务必用 Request::only(['name', 'email']) 或 allowField(['name', 'email'])
- 敏感字段(如 password)建议在模型的 setPasswordAttr 修改器中加密,而非控制器里手动 hash
- 涉及多表关联写入或强一致性要求,应使用事务:Db::startTrans(); try { ... } catch(\Exception $e) { Db::rollback(); }
- 主键为非自增或 UUID 场景,避免依赖 insertGetId(),改用业务生成 ID 后显式写入
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











