Laravel使用Model::insert批量新增后如何获取新创建的记录模型
批量插入后获取模型实例的解决方案
Model::insert() 是 Eloquent 封装的底层批量插入方法,只会生成单条 INSERT SQL 直接执行,不会实例化模型、也不会返回新增记录的主键,因此仅返回布尔值标识操作是否成功。要获取批量插入对应的模型实例,可以根据场景选择以下两种方案:
方案1:使用 createMany 方法(中小数据量场景优先)
Eloquent 提供的 createMany 方法会遍历传入的数据集,逐个调用模型创建逻辑,最终返回包含所有新增模型的集合。
注意:使用前需要确保批量插入的字段已在模型的
$fillable属性中声明,或模型设置了$guarded = []放开批量赋值限制。
示例代码:
$data = [['name' => 'john'], ['name' => 'Doe']]; $newModels = Model::createMany($data);
特点:
- 直接返回完整的模型集合,包含自增ID、数据库默认填充字段等所有属性
- 会正常触发模型的
saving、created等事件 - 底层为循环执行单条INSERT语句,数据量超过千级时性能会低于一次性批量插入
方案2:批量插入后按主键范围查询(大数据量无并发场景优先)
如果插入数据量很大需要保证插入性能,且当前插入场景无并发写入,可以通过插入前后的主键范围查询获取新增记录。
注意:该方案仅适用于使用自增整数作为主键的表,UUID等非连续主键场景无法使用。
示例代码:
// 查询插入前的最大主键ID $maxIdBefore = Model::query()->max('id'); $data = [['name' => 'john'], ['name' => 'Doe']]; $insertSuccess = Model::insert($data); if ($insertSuccess) { // 主键大于插入前最大值的记录即为本次新增的记录 $newModels = Model::query()->where('id', '>', $maxIdBefore)->get(); }
特点:
- 插入操作为单条批量INSERT语句,大数据量下性能远高于
createMany - 高并发写入场景下不适用,可能会查询到其他请求插入的无关记录
- 不会触发模型的创建相关事件
内容的提问来源于stack exchange,提问作者Kenneth
相关产品推荐
相关产品推荐

