thinkphp 5.x 使用 insertall() 批量插入二维关联数组,tp6.x 废弃该方法改用 insert() 传二维数组;两者均要求键名与字段一致,tp5失败返回 false,tp6失败抛异常;大数量建议分批,tp6推荐模型 saveall()。

Db::name('table_name')->insertAll() 是 ThinkPHP 5.x 中批量插入数据的常用写法,注意:ThinkPHP 6.x 已废弃 insertAll() 方法,改用 insert() 配合二维数组。下面按版本分别说明:
ThinkPHP 5.x 写法(支持 insertAll)
语法结构:
Db::name('user')->insertAll([
['name' => '张三', 'age' => 25, 'email' => 'z3@example.com'],
['name' => '李四', 'age' => 28, 'email' => 'l4@example.com'],
['name' => '王五', 'age' => 22, 'email' => 'w5@example.com']
]);
说明:
- 参数必须是**二维关联数组**,每项代表一行记录;
- 键名需与数据表字段完全一致(区分大小写);
- 成功返回插入的行数(int),失败返回 false;
- 自动过滤非法字段(需开启字段验证或使用 allowField(true))。
如需忽略重复、替换插入或指定冲突处理,TP5 不原生支持,需手写 SQL 或用 replace() 方法(慎用)。
ThinkPHP 6.x 写法(不再有 insertAll)
直接用 insert() 方法传入二维数组即可:
$data = [
['name' => '张三', 'age' => 25, 'email' => 'z3@example.com'],
['name' => '李四', 'age' => 28, 'email' => 'l4@example.com']
];
$result = Db::name('user')->insert($data);
说明:
- TP6 的 insert() 自动识别批量插入(当传入数组且首元素为数组时);
- 返回值同 TP5:成功返回影响行数,失败抛出异常(可 try-catch 捕获);
- 如需忽略重复(INSERT IGNORE)或 ON DUPLICATE KEY UPDATE,需用 query() 手写原生 SQL。
常见问题与建议
⚠️ 注意事项:
- 字段名不要加表前缀或反引号,框架会自动处理;
- 时间字段如
create_time若设为 datetime 类型,建议传字符串('Y-m-d H:i:s')或时间戳; - 批量数据量过大(如 >1000 条)建议分批插入,避免超时或内存溢出;
- TP6 中若模型类已定义,更推荐用模型的
saveAll()方法(支持事件、自动完成等)。
例如 TP6 模型方式:
UserModel::saveAll([
['name' => '张三', 'age' => 25],
['name' => '李四', 'age' => 28]
]);
不复杂但容易忽略版本差异,写之前先确认你用的是 TP5 还是 TP6。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











