Laravel8使用jenssegers/mongodb插入MongoDB数据后报prepare() on null错误如何解决
根本原因
该报错是因为调用DB门面时默认走了Laravel原生的SQL数据库连接逻辑,该逻辑依赖PDO实例的prepare()方法,但MongoDB连接没有对应的PDO实现。数据写入是由jenssegers/mongodb扩展完成的,后续SQL连接的收尾逻辑执行时才抛出了错误。
排查解决步骤
第一步:校验数据库配置
打开config/database.php文件,确认connections数组中已正确添加MongoDB连接配置:'mongodb' => [ 'driver' => 'mongodb', 'host' => env('MONGO_DB_HOST', '127.0.0.1'), 'port' => env('MONGO_DB_PORT', 27017), 'database' => env('MONGO_DB_DATABASE', '你的库名'), 'username' => env('MONGO_DB_USERNAME', ''), 'password' => env('MONGO_DB_PASSWORD', ''), 'options' => [] ],如果你全局使用MongoDB作为主库,可以把
config/database.php中的default参数值改为mongodb,否则无需修改默认配置。第二步:修正DB调用写法
如果没有修改默认数据库连接,调用时必须显式指定MongoDB连接:
原错误写法:DB::table('users')->insert(array('email'=>'ravi@gmail.com'))
修正后写法:DB::connection('mongodb')->table('users')->insert(['email'=>'ravi@gmail.com']);第三步:校验扩展版本匹配
Laravel 8 仅兼容jenssegers/mongodb3.8.x版本,执行以下命令查看当前安装的版本:composer show jenssegers/mongodb
如果版本不匹配,执行以下命令安装对应版本:composer require jenssegers/mongodb:3.8.*第四步:清理配置缓存
所有配置修改完成后,执行以下命令清理配置缓存,避免旧配置生效:php artisan config:clear
可选优化(模型层调用)
如果需要频繁操作MongoDB的集合,建议直接继承扩展提供的Model类,无需每次手动指定连接:
<?php namespace App\Models; use Jenssegers\Mongodb\Eloquent\Model; class MongoUser extends Model { // 指定连接 protected $connection = 'mongodb'; // 指定集合名,对应SQL的表名 protected $collection = 'users'; }
调用时直接使用模型方法即可:MongoUser::create(['email'=>'ravi@gmail.com']);
内容的提问来源于stack exchange,提问作者Nikul Panchal

