You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:24:04