## 介紹
`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的官方手冊中關于[數據庫](http://www.hmoore.net/manual/thinkphp5_1/353997)和[模型](http://www.hmoore.net/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手冊的[分布式數據庫](http://www.hmoore.net/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手冊的[數據庫部分](http://www.hmoore.net/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手冊的[模型章節](http://www.hmoore.net/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完全開發手冊的[模型](http://www.hmoore.net/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();
```
- 值得升級到5.1的18個理由
- 5.1.7版本新特性
- JSON字段類型在ORM中的使用
- 文件下載響應對象
- 教你使用5.1的數組對象查詢
- 模型三大利器之一:搜索器
- 在ThinkPHP中使用Yaconf
- 掌握命令行的表格輸出
- 5.1.25查詢參數綁定的改進
- ThinkPHP安全規范指引
- 巧用數據集的排序功能實現統計排序
- think-orm ——基于5.1的獨立ORM庫
- think-template——基于ThinkPHP的獨立模板引擎
- ThinkPHP5.1.26版本發布——修正版本,包含安全更新
- ThinkPHP5.0和3.2再發安全更新
- 官宣:ThinkPHP發布首個LTS版本
- 你真的了解Db類和模型的正確使用姿勢么?
- 如何更有效的記錄和管理日志
- 模型三大利器之二:修改器
- ThinkPHP5.1.28版本發布——修正上一版本問題,改進關聯查詢
- 模型三大利器之三:獲取器
- API版本控制的幾種思路
- ThinkPHP5.2第一個Beta版本發布測試
- 讓你少犯錯的數據查詢基本原則
- ThinkPHP發布5.1.29版本——常規更新
- 這15個好習慣讓你更容易升級到5.2
- 如何有效提高ThinkPHP的應用性能
- 讓你提高開發效率的查詢技巧
- 模型關聯查詢不完全指南
- 5.2發布Beta2版本——統一和精簡大量用法
- ThinkPHP發布5.1.30版本——支持微秒時間字段寫入
- ThinkPHP的數據緩存使用
- ThinkPHP5.2安裝及入口文件
- ThinkPHP榮獲2018 年度最受歡迎中國開源開發框架第1名
- 5.1路由使用心得技巧
- ThinkPHP5.*版本發布安全更新
- ThinkPHP項目及代碼規范指北
- 5.2版本的設計規范指導
- ThinkPHP5.1.32版本發布——圣誕快樂
- 利用Trait特性給模型增加樂觀鎖功能
- 5.2數據庫和模型的變化(摘要)
- ThinkPHP模板引擎實現和常見問題
- ThinkPHP5.0.24版本發布——安全更新
- 不忘初心,方得始終——ThinkPHP十三周年報告
- ThinkPHP5+相關資源匯總
- 異步社區ThinkPHP周年慶專享優惠活動
- 5.2路由的調整和改進
- ThinkPHP發布5.1.33版本——包含安全更新
- ThinkPHP擴展開發指南
- ThinkPHP發布5.2Beta3版本
- ThinkPHP發布5.1.34版本——喜迎新年
- ThinkPHP發布5.2RC1版本
- ThinkPHP發布5.1.35版本——常規更新
- 5.2配置類的調整
- 5.2時間查詢的改進和優化
- 5.2RC版本升級不完全指導(僅供學習參考)
- ThinkPHP5.2版本正式變更為6.0版本
- ThinkPHP百度云云虛擬主機專享免費活動
- 事件系統以及查詢事件、模型事件的使用
- ThinkPHP6.0RC2版本發布——架構升級、精簡核心
- ThinkPHP5.1.36LTS版本發布——常規更新
- 新版Session和Cookie設計變化
- ThinkPHP5.1.37版本發布——常規更新
- ThinkPHP6.0RC3版本發布——細節完善,體驗優化
- 6.0中間件使用詳解
- Composer各大廠商鏡像地址
- ThinkPHP6.0發布計劃公告
- 「ThinkPHP開發者周刊」招募志愿者
- ThinkPHP6.0日志變化
- ThinkPHP5.1.38版本發布——常規更新
- ThinkPHP6.0RC4版本發布——ORM獨立,日志多通道支持
- ThinkORM2.0開發指南上線
- ThinkPHP6.0RC5版本發布——多應用模式獨立,中間件機制調整
- ThinkPHP6.0版本發布——程序員節福利
- ThinkPHP5.1.39LTS版本發布——常規更新
- ThinkPHP6.0.1版本發布——圣誕快樂!
- 回顧2019,展望2020!
- ThinkPHPV6.0.2版本發布——2020新春快樂!
- 周年福利系列:Swoole合作優惠
- 億速云成為ThinkPHPV6.0獨家贊助發布商??
- 新冠疫情工具和限免資源專題(保持更新中)
- 周年福利系列:創宇信用認證合作優惠
- 周年福利系列:碼云企業版限時10%優惠
- 周年福利系列:想天短說抵現優惠
- think-swoole直播:從零開始掌握swoole開發
- 周年福利系列:B2C開源電商ShopXO授權8折優惠
- 周年福利系列:LayuiAdmin 永久授權限時優惠
- ThinkPHP資源導航站上線——構建生態 服務未來
- ThinkPHP官方技術支持服務和應用服務市場上線公測
- ThinkPHP市場精選——推廣基本要素
- ThinkPHP市場精選——客服聊天專題
- ThinkPHPV6.0.3版本發布——端午安康
- ThinkPHP開發者扶持計劃
- 6.0.3版本關鍵更新及升級事項
- 「ThinkPHP開發者周刊」改版重啟
- ThinkPHP市場精選——企業建站專題
- ThinkPHP 提供統一API接口服務
- ThinkPHP市場精選——直播電商專題
- ThinkAPI服務SDK發布
- 官方服務市場啟用獨立子域名
- ThinkPHP市場精選——刷臉支付專題
- ThinkAPI推出會員服務計劃
- ThinkPHPV6.0.4版本發布——中秋國慶雙節快樂
- ThinkPHPV5.1.40版本發布——常規更新
- 1024程序員節福利走一波
- ThinkPHP V6.0.5版本發布——兼容Composer2.0
- 知識圖譜應用場景——源論技術沙龍
- ThinkPHP5.*版本改進Composer2.0的兼容
- 官方市場雙十一精選推薦
- 技術人做產品有機會么(文末送課程)
- 本周秒殺——古德云售后獲客營銷系統
- ThinkAPI服務更新——支持接口分組和PHP版本依賴調整
- PHP8新特性盤點
- PHP8新特性系列:構造器屬性提升使用及注意事項
- ThinkPHP2021新年寄語
- ThinkPHP V6.0.6&V5.1.41版本發布——兼容PHP8.0
- PHP如何更優雅地調用API接口
- ThinkPHP V6.0.7發布——修正版本
- ThinkAPI服務更新——IP白名單
- 最新版ThinkORM對于時間字段的調整
- ThinkAPI短信接口正式上線
- ThinkPHP V6.0.8版本發布——多環境變量配置支持
- 頂想云寫作服務開啟第一次公測
- ThinkSSL上線——官方SSL/TLS證書服務
- MDBootstrap國內用戶福利——ThinkPHP官方市場首發
- ThinkPHP V6.0.9版本發布——常規更新
- ThinkORM功能盤點——虛擬模型
- 全面支持主流GIT版本庫——云寫作服務第二次公測
- 云寫作服務私有化部署方案之:版本庫私有化
- 看云雙十一活動
- ThinkPHP V6.0.10LTS發布——兼容PHP8.1
- ThinkPHP V6.0.12發布——命令行兼容8.1
- 頂想云知識管理上線公測——構建企業文檔中心和知識庫
- 頂想云上線——助力生態數字化建設
- 618活動進行中——官方市場迎來一波更新
- 頂想云知識管理正式上線——看云文檔啟動遷移服務
- ThinkPHP V6.0.13發布——常規更新
- 頂想云網站助理服務上線——構建產品支持服務
- ThinkPHP發布6.1.0&6.0.14版本——安全更新
- ThinkPHP新版社區上線試運營
- ThinkAPI上架人臉核身接口——助力網站實名認證
- 辭舊迎新——舊版社區停止注冊及發帖
- ThinkPHP6.1.2版本發布——兼容PHP8.2