ThinkPHP如何使用ThinkOrm封装_ThinkOrm数据库封装方法【指南】
一、引入 ThinkOrm 独立包并初始化连接
如果你正在寻找一个轻量、独立且能兼容多种数据库的ORM方案,又不想为了它而引入整个ThinkPHP框架,那么ThinkOrm的封装方案正好能派上用场。它本质上是一个剥离出来的PDO抽象层,开箱即用。具体怎么操作呢?咱们一步步来看。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
首先,ThinkOrm是从ThinkPHP 5.1的ORM核心中独立出来的,它支持包括MySQL、Pgsql、Sqlite、SqlServer、Oracle乃至MongoDB在内的多种数据库驱动。最大的好处是,它不依赖任何框架容器,只需要引入自动加载器并完成基础配置,就能立刻跑起来。
第一步,通过Composer安装这个独立包:composer require thinkyaf/thinkorm
第二步,在你的项目入口文件或者服务初始化的地方,引入Composer的自动加载器:require ‘vendor/autoload.php’;

第三步,使用Db类手动创建一个数据库连接实例。配置方式非常直观,比如连接MySQL:use think\Db; $db = Db::connect([‘type’=>‘mysql’,‘hostname’=>‘127.0.0.1’,‘database’=>‘test’,‘username’=>‘root’,‘password’=>’’]);
完成这三步,你的独立ORM环境就搭建好了。
二、使用查询构造器执行链式操作
连接建立后,怎么操作数据库呢?ThinkOrm提供了一套与ThinkPHP风格高度一致的查询构造器接口。所有操作都从Db::table()开始,它返回一个Query实例,让你可以流畅地进行链式调用。这种方式特别适合那些不需要复杂模型映射的快速查询场景。
来看几个典型的例子:
执行一个基础的条件查询并排序:Db::table(‘user’)->where(‘status’, 1)->order(‘id’, ‘desc’)->limit(10)->select();
插入一条新记录:Db::table(‘user’)->data([‘name’=>‘Alice’,‘email’=>‘a@example.com’])->insert();
更新符合条件的数据:Db::table(‘user’)->where(‘id’, 5)->update([‘last_login’=>date(‘Y-m-d H:i:s’)]);
删除记录,并获取影响的行数:Db::table(‘log’)->where(‘created_at’, ‘delete();
可以看到,语法非常简洁明了,几乎没有任何学习成本。
三、定义模型类并启用 ORM 映射
当然,如果你的业务逻辑更复杂,需要用到数据验证、模型事件、关联关系或者自动时间戳这些高级功能,那么定义独立的模型类就是更好的选择。好消息是,ThinkOrm的模型类可以完全脱离ThinkPHP标准的application目录结构,只要保证命名空间和自动加载规则匹配,放在任何位置都可以。
具体怎么做?
首先,创建一个模型文件,例如User.php,路径可以自定义,比如放在app/model/目录下:
namespace app\model; use think\Model; class User extends Model { protected $table = ‘user’; }
定义好后,在代码中就可以直接使用静态方法进行操作了:app\model\User::where(‘id’, 1)->find();
也可以实例化后操作,模型会自动处理时间戳等字段:$user = new app\model\User(); $user->name = ‘Bob’; $user->sa ve();
还有一个非常实用的功能是软删除。只需在模型中引入对应的Trait并设置删除时间字段,查询时就会自动过滤掉已“删除”的数据:
use think\model\concern\SoftDelete; class User extends Model { use SoftDelete; protected $deleteTime = ‘delete_time’; }
四、配置多数据库连接与读写分离
对于需要应对更高并发或数据分布在不同数据库的场景,ThinkOrm同样提供了灵活的支持。它允许在运行时动态切换连接,无论是为了实现读写分离,还是进行跨库联合查询,都能轻松应对。
关键在于配置和管理多个连接。你可以先定义一个包含主从库信息的配置数组:
$configs = [‘master’=>[‘type’=>‘mysql’,‘hostname’=>‘master.host’],‘sla ve’=>[‘type’=>‘mysql’,‘hostname’=>‘sla ve.host’]];
进行只读查询时,可以显式指定使用从库连接:Db::connect($configs[‘sla ve’])->table(‘user’)->where(‘id’, 1)->find();
对于模型,你可以通过设置connection属性将其绑定到特定的连接配置上:class Order extends Model { protected $connection = ‘master’; }
最后,需要特别注意的是事务操作。事务内的所有数据库操作,必须确保在同一个连接实例上执行,否则会出错。标准的写法是这样的:
$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; }
遵循这个模式,就能安全地处理跨表事务了。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
怎么利用 System.err 输出错误流并在控制台中以醒目的颜色标记(取决于终端)
怎么利用 System err 输出错误流并在控制台中以醒目的颜色标记(取决于终端) System err 默认行为不带颜色,终端是否显示颜色取决于自身支持 首先得明确一点:System err 本质上只是 Ja va 标准库里的一个 PrintStream 对象。它本身并不负责“颜色”这种花哨的玩
如何在 Java 中使用 ThreadLocal.remove() 确保在线程池复用场景下不会发生数据污染
如何在 Ja va 中使用 ThreadLocal remove() 确保在线程池复用场景下不会发生数据污染 说到线程池和 ThreadLocal 的搭配使用,一个看似不起眼、实则极易“踩坑”的细节就是数据清理。想象一下,你精心设计的线程池正在高效运转,却因为某个任务留下的“数据尾巴”,导致后续任务
怎么利用 Arrays.asList() 转换出的“受限列表”理解其对 add() 等修改操作的限制
Arrays asList():一个“受限”但实用的列表视图 在Ja va开发中,Arrays asList()是一个高频使用的方法,但你是否真正了解它返回的是什么?一个常见的误解是,它直接生成了一个标准的ArrayList。事实并非如此。 简单来说,Arrays asList()返回的并非我们熟悉
如何在 Java 中利用 try-catch 实现对“软错误”的平滑感知与非侵入式监控日志记录
如何在 Ja va 中利用 try-catch 实现对“软错误”的平滑感知与非侵入式监控日志记录 在 Ja va 开发中,我们常常会遇到一些“软错误”——它们不会让程序直接崩溃,却可能悄悄影响业务的正确性或用户体验。比如,调用第三方 API 时返回了空响应、缓存查询未命中、配置文件里某个非关键项缺失
Django怎么防止Celery任务重复执行_Python结合Redis实现分布式锁
Django怎么防止Celery任务重复执行:Python结合Redis实现分布式锁 你遇到过吗?明明只发了一次任务,后台却执行了两次。这不是代码写错了,而是分布式环境下一个经典的老朋友:多个worker同时抢到了同一个活儿。 为什么Celery任务会重复执行 问题的根源在于竞争。想象一下,多个Ce
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

