ThinkOrm 是轻量独立的 PDO 抽象 ORM,支持多数据库;通过 Composer 安装、引入自动加载器并配置 Db::connect 即可使用,提供链式查询构造器操作。

如果您在 ThinkPHP 项目中需要轻量、独立且兼容多数据库的 ORM 能力,而无需完整引入 ThinkPHP 库,ThinkOrm 封装方案可提供直接可用的 PDO 层抽象。以下是实现该封装的具体方法:
一、引入 ThinkOrm 独立包并初始化连接
ThinkOrm 是基于 ThinkPHP5.1 ORM 内核剥离出的独立封装,支持 PDO 驱动及 MySQL、Pgsql、Sqlite、SqlServer、Oracle 和 MongoDB。其核心不依赖框架容器,仅需加载自动加载器并配置连接参数即可启动。
1、通过 Composer 安装独立包:composer require thinkyaf/thinkorm
2、在入口文件或服务初始化处引入自动加载:require 'vendor/autoload.php';
立即学习“PHP免费学习笔记(深入)”;
3、使用 Db 类手动创建连接实例:use think\Db; $db = Db::connect(['type'=>'mysql','hostname'=>'127.0.0.1','database'=>'test','username'=>'root','password'=>'']);
二、使用查询构造器执行链式操作
ThinkOrm 提供与 ThinkPHP 风格一致的查询构造器接口,所有操作均基于 Db::table() 返回的 Query 实例,不强制绑定模型类,适用于无模型映射的快速查询场景。
1、执行基础查询:Db::table('user')->where('status', 1)->order('id', 'desc')->limit(10)->select();
2、插入单条记录:Db::table('user')->data(['name'=>'Alice','email'=>'a@example.com'])->insert();
3、更新指定条件数据:Db::table('user')->where('id', 5)->update(['last_login'=>date('Y-m-d H:i:s')]);
4、删除记录并返回影响行数:Db::table('log')->where('created_at', 'delete();
三、定义模型类并启用 ORM 映射
当需复用验证、事件、关联、自动时间戳等高级能力时,应继承 think\Model 基类构建模型。模型类可脱离 application 目录存在,只需确保命名空间与自动加载规则匹配。
1、创建模型文件 User.php,路径可自定义(如 app/model/User.php):namespace app\model; use think\Model; class User extends Model { protected $table = 'user'; }
2、在代码中直接调用静态方法操作:app\model\User::where('id', 1)->find();
3、新增数据并自动写入时间字段:$user = new app\model\User(); $user->name = 'Bob'; $user->save();
4、启用软删除并在查询中自动过滤:use think\model\concern\SoftDelete; class User extends Model { use SoftDelete; protected $deleteTime = 'delete_time'; }
四、配置多数据库连接与读写分离
ThinkOrm 支持在运行时动态切换连接,通过 connection 参数指定不同配置键,适用于主从分离或跨库联合查询等场景。
1、定义多个连接配置数组:$configs = ['master'=>['type'=>'mysql','hostname'=>'master.host'],'slave'=>['type'=>'mysql','hostname'=>'slave.host']];
2、显式调用从库执行只读查询:Db::connect($configs['slave'])->table('user')->where('id', 1)->find();
3、在模型中设置 connection 属性以绑定特定连接:class Order extends Model { protected $connection = 'master'; }
4、事务操作必须使用同一连接实例:$db = Db::connect($configs['master']); $db->startTrans(); try { $db->table('account')->where('id',1)->dec('balance', 100); $db->table('log')->insert(['action'=>'deduct']); $db->commit(); } catch (\Exception $e) { $db->rollback(); throw $e; }



















