## 介绍 `think-orm`是一个基于PHP`5.6+` 的`ORM`实现,主要特性包括: - 基于ThinkPHP5.1的`ORM`封装 - 支持`Mysql`/`Pgsql`/`Sqlite`/`SqlServer`/`Oracle`/`Mongodb` - 基于`PDO`实现 - 支持原生查询和查询构造器 - 支持事务 - 支持模型和关联(和ThinkPHP内置一致) 应该说功能特性和`ThinkPHP`内置的`ORM`几乎一致,适用于不使用`ThinkPHP`框架的开发者,对于习惯了ThinkPHP的ORM操作但不得已必须使用其它框架的用户来说是一个福音。 >[danger] 本文主要列出一些基本用法和区别所在,以及一些注意事项,更多的详细用法建议直接阅读ThinkPHP5.1的官方手册中关于[数据库](https://www.kancloud.cn/manual/thinkphp5_1/353997)和[模型](https://www.kancloud.cn/manual/thinkphp5_1/354040)章节。 ## 安装 如果你已经有自己的基于composer的应用了,可以直接使用`composer`安装 ``` composer require topthink/think-orm ``` 如果暂时还没有,可以创建一个目录并添加`VHOST`进行测试, ``` mkdir orm cd orm composer require topthink/think-orm ``` 然后在orm目录下面添加一个入口文件,写法类似下面这样。 ``` <?php namespace think; require __DIR__.'/vendor/autoload.php'; // 下面添加后面提到的测试代码 ``` 目前最新版本为`V1.2.11`,功能和ThinkPHP`5.1`最新版本同步更新。 ## 数据库配置 数据库配置使用`Db::setConfig()`方法设置。 ```php use think\Db; // 数据库配置信息设置(全局有效) Db::setConfig([ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'demo', // 用户名 'username' => 'root', // 密码 'password' => '', // 端口 'hostport' => '', ]); // 获取数据库配置信息 $dbConfig = Db::getConfig(); $database = Db::getConfig('database'); ``` 包目录下的`src/config.php`文件提供了完整的配置参数以及默认配置(该配置文件会自动加载)。 为了方便统一管理,你可以通过在单独文件中定义数据库配置后加载。 ``` Db::setConfig(include '/config/database.php'); ``` ## 多数据库和分布式支持 数据库配置也支持配置多个数据库连接,然后通过`connect()`方法动态切换连接。 ``` Db::setConfig([ 'mysql' => [...], 'mongo' => [...], ]); Db::connect('mysql')->name('user')->select(); ``` 当然,如果需要你仍然可以在`connect`方法中传入实际的数据库配置参数(数组)。 支持分布式数据库,包括读写分离,具体可以参考5.1手册的[分布式数据库](https://www.kancloud.cn/manual/thinkphp5_1/354039) ## CURD操作 数据库CURD操作的用法和ThinkPHP几乎一致。 ~~~php use think\Db; // 进行CURD操作 Db::table('user') ->data(['name'=>'thinkphp','email'=>'thinkphp@qq.com']) ->insert(); Db::table('user') ->where('id','>',10) ->order('id','desc') ->limit(10) ->select(); Db::table('user') ->where('id',10) ->update(['name'=>'test']); Db::table('user') ->where('id',10) ->delete(); ~~~ `Db`类支持所有的`ThinkPHP`数据库链式操作,具体的可以参考5.1手册的[数据库部分](https://www.kancloud.cn/manual/thinkphp5_1/353999)。 `think-orm`的Db类增加的(静态)方法包括: - `setConfig` 设置全局配置信息 - `getConfig` 获取数据库配置信息 - `setQuery` 设置数据库Query类名称 - `setCacheHandler` 设置缓存对象Handler(必须支持`get`、`set`及`rm`方法) - `getSqlLog` 用于获取当前请求的SQL日志信息(包含连接信息) ## 模型 定义模型很简单,你只需要继承`think\Model`即可。 ~~~php <?php namespace app\model; use think\Model; class User extends Model { } ~~~ 模型可以单独定义数据库连接和对应的表名。 ~~~php <?php namespace app\model; use think\Model; class User extends Model { // 设置当前模型对应的完整数据表名称 protected $table = 'think_user'; // 设置当前模型的数据库连接 protected $connection = 'db_config'; // 如果主键不是id则需要单独定义 protected $pk = 'uid'; } ~~~ 模型操作: ~~~php use app\model\User; $user = User::get(1); $user->name = 'thinkphp'; $user->save(); ~~~ 你可以和`ThinkPHP`一样使用包括获取器、修改器和搜索器在内的模型功能,具体参考5.1手册的[模型章节](https://www.kancloud.cn/manual/thinkphp5_1/354040)。 ## Db类和模型用法对比 #### 创建Create Db用法 ```php Db::table('user') ->insert([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com', ]); ``` 模型用法 ```php $user = new User; $user->name = 'thinkphp'; $user->email = 'thinkphp@qq.com'; $user->save(); ``` 批量设置 ```php $user = new User; $user->save([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com', ]); ``` #### 读取Read Db用法 ```php $user = Db::table('user') ->where('id', 1) ->find(); // 或者 $user = Db::table('user') ->find(1); echo $user['id']; echo $user['name']; ``` 模型用法 ```php $user = User::get(1); echo $user->id; echo $user->name; ``` 模型实现读取多个记录 ```php // 查询用户数据集 $users = User::where('id', '>', 1) ->limit(5) ->select(); // 遍历读取用户数据 foreach ($users as $user) { echo $user->id; echo $user->name; } ``` #### 更新Update Db用法 ```php Db::table('user') ->where('id', 1) ->update([ 'name' => 'topthink', 'email' => 'topthink@qq.com', ]); ``` 模型用法 ```php $user = User::get(1); $user->name = 'topthink'; $user->email = 'topthink@qq.com'; $user->save(); ``` 或者使用 ```php $user = User::get(1); $user->save([ 'name' => 'topthink', 'email' => 'topthink@qq.com', ]); ``` 静态调用 ```php User::update([ 'name' => 'topthink', 'email' => 'topthink@qq.com', ], ['id' => 1]); ``` #### 删除Delete Db用法 ```php Db::table('user')->delete(1); ``` 模型用法 ```php $user = User::get(1); $user->delete(); ``` 或者静态实现 ```php User::destroy(1); ``` `destroy`方法支持删除指定主键或者查询条件的数据 ```php // 根据主键删除多个数据 User::destroy([1, 2, 3]); // 指定条件删除数据 User::destroy([ 'status' => 0, ]); // 使用闭包条件 User::destroy(function ($query) { $query->where('id', '>', 0) ->where('status', 0); }); ``` 更多模型用法可以参考5.1完全开发手册的[模型](https://www.kancloud.cn/manual/thinkphp5_1/354041)章节 ## 查询缓存 由于`think-orm`包没有内置缓存类,所以如果你需要使用查询缓存功能,必须设置缓存对象。 ``` // 你可以实例化自己的缓存类 假设为Cache $cache = new Cache(); // 设置查询缓存对象 Db::setCacheHandler($cache); ``` 现在你就可以使用数据库的查询缓存功能了。 ## 功能扩展 如果你觉得内置的查询类功能不能满足需求,可以自己扩展一个`think\db\Query`类的子类(例如 `app\db\Query`),然后使用 ``` // 设置查询对象类 Db::setQuery('app\db\Query'); ``` ## 获取SQL日志 你可以通过下面的方法获取当前请求的SQL日志 ``` $sqlHistory = Db::getSqlLog(); ```