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

Laravel中使用jenssegers/mongodb如何获取最后插入文档的ID?

在jenssegers/mongodb中获取新插入文档ID的替代方案

你遇到的Call to a member function lastInsertId() on null错误,本质原因是MongoDB驱动并不基于PDO实现,所以DB::getPdo()会返回null,自然没法调用PDO的lastInsertId()方法。

下面给你几个实用的替代方案,适配jenssegers/mongodb ^3.9.2和Laravel ^9.30.1的场景:

1. 直接从创建的模型实例获取ID

这是最直接的方式,因为Laravel的Eloquent模型(包括jenssegers适配的MongoDB模型)在调用create()或save()后,会自动把插入文档的_id(或你自定义的主键)赋值到模型实例上。

示例代码:

// 控制器的store方法中
$item = Item::create($validatedData);
// 直接获取ID,默认是_id字段,如果你在模型里设置了$primaryKey = 'id',就用$item->id
$insertedId = $item->_id; // 或者 $item->id

在测试里,你完全不需要单独去查ID,直接通过模型查询最新数据或者关联字段匹配就能完成断言:

public function testItemStoreRedirect()
{
    $testData = [
        'name' => '测试商品',
        // 其他必填字段
    ];

    $response = $this->post(route('items.store'), $testData);

    // 通过唯一字段找到刚创建的文档
    $newItem = Item::where('name', $testData['name'])->first();
    // 断言重定向到详情页
    $response->assertRedirect(route('items.show', $newItem->id));
}

2. 通过MongoDB连接实例获取插入ID

如果是直接操作集合(而非Eloquent模型),可以用MongoDB连接的insert()方法返回的结果对象获取ID:

$connection = DB::connection('mongodb');
$insertResult = $connection->collection('items')->insert($data);
$insertedId = $insertResult->getInsertedId();

如果是批量插入,可用getInsertedIds()获取所有插入的ID:

$insertResult = $connection->collection('items')->insertMany($dataArray);
$insertedIds = $insertResult->getInsertedIds();

3. 事务场景下的注意事项

你提到代码里用了MongoDB事务,需要确保你的MongoDB环境是4.0+版本的副本集/分片集群(单节点不支持事务)。在事务中创建模型后,同样可以直接从模型实例获取ID,不需要额外操作——事务提交后ID会正常生效。

内容的提问来源于stack exchange,提问作者Petro Gromovo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:50:40