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
相关产品推荐
相关产品推荐

