Laravel 8中使用Eloquent的insert方法获取最后插入的ID
Laravel使用insert方法插入数据后获取最后插入ID的解决方案
Model::insert() 方法底层基于查询构造器实现,仅会返回布尔值表示写入是否成功,本身不支持直接返回最后插入的自增ID,可根据你的写入场景选择对应方案:
单条数据插入场景
直接将insert替换为insertGetId方法即可,该方法会直接返回新写入数据的自增ID:
$id = Product::insertGetId($alldata); if ($id) { return response()->json([ 'success' => 'Ürün başarıyla Eklendi.', 'id' => $id ]); }
如果你的表主键名不是默认的
id,可以给方法传第二个参数指定主键名,例如insertGetId($alldata, 'product_id')。
批量数据插入场景
如果你的$alldata包含多条要批量写入的数据,可选择以下两种方案:
- 方案A:事务加锁获取
配合事务和行锁避免并发插入干扰,此时拿到的表最大ID就是本次插入的最后一条ID,不会混入其他请求写入的数据:$lastInsertId = 0; \DB::transaction(function () use ($alldata, &$lastInsertId) { // 加锁阻塞其他写入操作,避免并发导致ID不准 Product::lockForUpdate()->max('id'); Product::insert($alldata); $lastInsertId = Product::max('id'); }); if ($lastInsertId) { return response()->json([ 'success' => 'Ürün başarıyla Eklendi.', 'id' => $lastInsertId ]); } - 方案B:单条循环写入
数据量不大的场景下,改用create方法循环写入,可以直接拿到每一条的写入ID,性能比批量insert稍差:$lastInsertId = 0; foreach ($alldata as $item) { $product = Product::create($item); $lastInsertId = $product->id; }注意使用
create方法需要提前在模型的$fillable属性中配置允许批量写入的字段。
内容的提问来源于stack exchange,提问作者Tekin GÜNDOĞDU
相关产品推荐
相关产品推荐

