thinkphp 3.2 的 addall() 方法通过单条 insert into ... values (),(),() 批量插入二维数组数据,返回成功条数或 false;不默认触发自动完成与验证,需手动补全字段;仅返回首条自增 id,大数据量需分批处理。

ThinkPHP 3.2 的 addAll() 方法用于批量插入多条记录,比循环调用 add() 效率更高,底层执行的是单条 INSERT INTO ... VALUES (),(),() 的 SQL 语句。
addAll 方法的基本用法
addAll() 是模型类的方法,接收二维数组(每条数据为一个一维关联数组),返回插入成功的记录数(失败返回 false)。
示例:
$User = D('User');
$data = array(
array('name' => '张三', 'email' => 'zhangsan@example.com', 'status' => 1),
array('name' => '李四', 'email' => 'lisi@example.com', 'status' => 1),
array('name' => '王五', 'email' => 'wangwu@example.com', 'status' => 0),
);
$result = $User->addAll($data);
if ($result === false) {
echo $User->getError(); // 获取错误信息
} else {
echo "成功插入 {$result} 条记录";
}
注意字段映射与自动完成
addAll() 默认不触发模型的自动验证、自动完成和自动过滤(除非显式开启)。如需启用,需在模型中设置:
-
protected $autoCheckFields = true;(确保字段合法性检查) - 若要支持自动完成(如
create_time自动写入),需手动在数据中添加,或改用create()+ 循环add()(但失去批量优势) - 推荐做法:在组装
$data数组时,统一补全公共字段(如create_time、update_time)
处理主键返回与自增 ID
addAll() 在 MySQL 下默认返回第一条插入记录的自增 ID(不是全部 ID),无法直接获取所有新记录 ID。如需获取全部 ID,有以下方式:
- 利用 MySQL 的
LAST_INSERT_ID()+ 插入数量推算(仅适用于连续自增、无并发干扰场景) - 改用事务 + 单条
add()并收集 ID(牺牲性能换可控性) - 升级到 ThinkPHP 5/6,使用更完善的批量插入及 ID 返回支持
常见问题与规避建议
- 字段名必须与数据表字段完全一致(区分大小写,取决于数据库配置)
- 空数组或非二维数组传入会报错或返回 0,使用前应校验:
is_array($data) && !empty($data) && is_array($data[0]) - 超出 MySQL
max_allowed_packet限制时会失败,大数据量建议分批(如每 500 条一批) - 不支持关联写入(如自动处理 belongsTo 关系),需业务层自行保障外键完整性
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











