当前位置: 首页
编程语言
ThinkPHP如何使用ThinkOrm封装_ThinkOrm数据库封装方法【指南】

ThinkPHP如何使用ThinkOrm封装_ThinkOrm数据库封装方法【指南】

热心网友 时间:2026-05-06
转载

一、引入 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’;

ThinkPHP如何使用ThinkOrm封装_ThinkOrm数据库封装方法【指南】

第三步,使用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; }

遵循这个模式,就能安全地处理跨表事务了。

来源:https://www.php.cn/faq/2425109.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
怎么利用 System.err 输出错误流并在控制台中以醒目的颜色标记(取决于终端)

怎么利用 System.err 输出错误流并在控制台中以醒目的颜色标记(取决于终端)

怎么利用 System err 输出错误流并在控制台中以醒目的颜色标记(取决于终端) System err 默认行为不带颜色,终端是否显示颜色取决于自身支持 首先得明确一点:System err 本质上只是 Ja va 标准库里的一个 PrintStream 对象。它本身并不负责“颜色”这种花哨的玩

时间:2026-05-06 09:59
如何在 Java 中使用 ThreadLocal.remove() 确保在线程池复用场景下不会发生数据污染

如何在 Java 中使用 ThreadLocal.remove() 确保在线程池复用场景下不会发生数据污染

如何在 Ja va 中使用 ThreadLocal remove() 确保在线程池复用场景下不会发生数据污染 说到线程池和 ThreadLocal 的搭配使用,一个看似不起眼、实则极易“踩坑”的细节就是数据清理。想象一下,你精心设计的线程池正在高效运转,却因为某个任务留下的“数据尾巴”,导致后续任务

时间:2026-05-06 09:59
怎么利用 Arrays.asList() 转换出的“受限列表”理解其对 add() 等修改操作的限制

怎么利用 Arrays.asList() 转换出的“受限列表”理解其对 add() 等修改操作的限制

Arrays asList():一个“受限”但实用的列表视图 在Ja va开发中,Arrays asList()是一个高频使用的方法,但你是否真正了解它返回的是什么?一个常见的误解是,它直接生成了一个标准的ArrayList。事实并非如此。 简单来说,Arrays asList()返回的并非我们熟悉

时间:2026-05-06 09:59
如何在 Java 中利用 try-catch 实现对“软错误”的平滑感知与非侵入式监控日志记录

如何在 Java 中利用 try-catch 实现对“软错误”的平滑感知与非侵入式监控日志记录

如何在 Ja va 中利用 try-catch 实现对“软错误”的平滑感知与非侵入式监控日志记录 在 Ja va 开发中,我们常常会遇到一些“软错误”——它们不会让程序直接崩溃,却可能悄悄影响业务的正确性或用户体验。比如,调用第三方 API 时返回了空响应、缓存查询未命中、配置文件里某个非关键项缺失

时间:2026-05-06 09:59
Django怎么防止Celery任务重复执行_Python结合Redis实现分布式锁

Django怎么防止Celery任务重复执行_Python结合Redis实现分布式锁

Django怎么防止Celery任务重复执行:Python结合Redis实现分布式锁 你遇到过吗?明明只发了一次任务,后台却执行了两次。这不是代码写错了,而是分布式环境下一个经典的老朋友:多个worker同时抢到了同一个活儿。 为什么Celery任务会重复执行 问题的根源在于竞争。想象一下,多个Ce

时间:2026-05-06 09:58
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程