thinkphp 3.2 的 addall() 在 tp5/6 中已移除,由 db::insertall() 替代:tp5 中返回影响行数,需手动补全字段;tp6 校验更严格,仍不返回全部 id;saveall() 因逐条执行且触发完整模型逻辑,不适用于高性能批量插入。

ThinkPHP 3.2 的 addAll() 在 TP5 和 TP6 中没有同名方法,已彻底移除,对应功能由更明确、更可控的替代方式承担。
TP5 中的替代:Db 类的 insertAll()
ThinkPHP 5 使用 Db::name('table')->insertAll($data) 替代 addAll()。它不走模型层,直接执行原生批量 INSERT,性能接近,且不触发模型的自动验证、自动完成或事件回调。
- 返回值为插入成功行数(int),不是 ID
- 不支持自动填充,字段需提前补全(如
'create_time' => date('Y-m-d H:i:s')) - 若需获取自增 ID,调用
Db::getLastInsID(),仅得最后一条的 ID - 推荐搭配
allowField(true)或显式传入合法字段数组,避免“Unknown column”错误
TP6 中的替代:Db 类的 insertAll() + insertGetId() 补充
TP6 延续 TP5 的 Db::name('table')->insertAll($data),行为基本一致,但字段校验更严格,默认开启白名单检查(依赖数据库驱动配置)。
- 仍不返回全部主键,
insertAll()只返回影响行数 -
insertGetId()仅用于单条插入并返回 ID,不能用于批量 - 如确需全部 ID,且环境可控(纯自增、无并发),可用
LAST_INSERT_ID()+ 行数推算;否则建议分批 + 循环insert() - 模型类不再提供
addAll(),也不再支持M('User')->addAll()写法,强行调用会报Call to undefined method
为什么不复用模型的 saveAll()?
TP5/6 中存在 Model::saveAll($data),但它本质是循环调用 save(),每条记录单独执行 SQL,失去批量效率优势,且会完整触发验证、自动完成、事件等开销。
- 适合需要逐条校验或业务逻辑强依赖模型钩子的场景
- 不适合纯粹高性能写入,尤其是万级数据导入
- 与
addAll()的设计初衷(高效拼 SQL)已背道而驰
本质上,addAll() 是 TP3.2 针对 MySQL 的轻量批量方案;TP5/6 把这个能力下沉到 Db 层,剥离模型干扰,更透明也更安全。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











