ThinkPHP 6.0 编写自定义的数据库驱动连接 MongoDB:NoSQL

作者:袖梨 2026-07-14
ThinkPHP 6.0 官方不内置 MongoDB 支持,需通过自定义 Connection 和 Query 类适配:先确认安装官方 mongodb 扩展,再实现 MongoConnection 和 MongoQuery 类并注册到 database.php,最后在模型中继承自定义基类并规范 BSON 类型处理与查询语法。

ThinkPHP 6.0 官方不内置 MongoDB 支持,但允许通过自定义数据库驱动方式接入。这不是简单改配置就能跑通的事,核心在于绕过默认 DB 层、直连原生 MongoDB 扩展,并封装适配 ThinkPHP 的 Query/Connection 接口。

确认底层扩展已就位

必须先确保 PHP 环境装的是官方 mongodb 扩展(不是已废弃的 mongo),且版本兼容 PHP 8.x(2026 年主流环境)。运行以下命令验证:

  • php -m | grep mongodb —— 有输出才代表扩展加载成功
  • php --ri mongodb —— 查看扩展版本与支持特性(如是否启用 SSL、压缩等)
  • 若未安装,用 pecl install mongodb 或系统包管理器(如 Ubuntu 的 apt install php-mongodb)安装,并在 php.ini 中启用 extension=mongodb.so

实现自定义 Connection 和 Query 类

TP6 要求你提供符合框架契约的连接类和查询类。不能直接 new MongoDBClient,而要继承或实现标准接口:

  • 创建 appdriverMongoConnection.php,继承 thinkdbConnection,重写 initConnect() 方法,内部实例化 MongoDBDriverManagerMongoDBClient
  • 创建 appdriverMongoQuery.php,继承 thinkdbQuery,覆盖 select()insert()update() 等方法,将 ThinkPHP 的链式调用转译为 MongoDB 原生操作(如 find()insertOne()
  • 注意 BSON 类型转换:比如 new MongoDBBSONObjectId($id) 处理 _idnew MongoDBBSONUTCDateTime(strtotime('now') * 1000) 处理时间字段

注册驱动并配置 database.php

配置文件需明确指向你的自定义类,而非字符串标识:

立即学习“PHP免费学习笔记(深入)”;

  • config/database.php'connections' 中添加一项:
  • 'mongo' => [ 'type' => 'appdriverMongoConnection', 'query' => 'appdriverMongoQuery', 'hostname' => '127.0.0.1', 'database' => 'test', 'hostport' => '27017', 'username' => '', 'password' => '', 'options' => [] ]
  • 设置 'default' => 'mongo' 或在模型中显式指定 protected $connection = 'mongo';
  • URI 中含特殊字符(如 @/)时,务必对用户名/密码做 rawurlencode() 编码,否则连接会被截断

模型层适配与使用规范

TP6 的 Model 默认面向关系型数据库,需针对性调整:

  • 模型类不继承 thinkModel,而是继承你自定义的基类(如 appmodelMongoModel),该基类内部绑定你的 MongoQuery
  • 禁用自动时间戳字段($autoWriteTimestamp 设为 false),或自行处理为 UTCDateTime
  • 主键统一设为 protected $pk = '_id';,且读取时需手动转成字符串((string)$doc->_id)才能 JSON 输出
  • 避免使用 where() 直接传数组条件,优先用原生查询语法:$model->whereRaw(['status' => 'active'])->select()(需你在 Query 中实现 whereRaw

相关文章

精彩推荐