### 2019 年 2 月 14 日 發布
`5.2`在經過幾個月的測試版本迭代后,正式進入候選版本。之后的重點工作會是擴展以及文檔的完善。當然,不排除核心還有微調的可能。
ThinkPHP5.2`RC1`版本繼上個版本[`beta3`版本](https://blog.thinkphp.cn/934993)發布以來,主要更新如下:
## 新特性
### 支持`FIND_IN_SET`查詢
增加了新的查詢表達式對`FIND_IN_SET`的支持,使用下面的查詢即可:
```
Db::name('user')->where('group_list', 'find in set', 2)->select();
```
### 增加了分區查詢支持
增加了對分區的支持(需要MySQL`5.6+`版本),例如你對`user`表分了`p1`和`p2`兩個分區,你可以使用下面的查詢:
```
Db::name('user')->partition('p1')->insert(['name' => 'think']);
Db::name('user')->partition(['p1', 'p2'])->select();
Db::name('user')->partition(['p1', 'p2'])->where('name', 'think')->update(['name' => 'thinkphp']);
Db::name('user')->partition('p1')->where('name', 'think')->delete();
```
### 增加了`ON DUPLICATE UPDATE`支持
支持`ON DUPLICATE UPDATE`,例如:
```
Db::name('user')->duplicate(['score' => 10])->insert(['name' => 'think']);
```
### 增加`extra`方法設置查詢額外參數
`extra`方法可以用于`CURD`查詢,例如:
```
Db::name('user')->extra('IGNORE')->insert(['name' => 'think']);
Db::name('user')->extra('DELAYED')->insert(['name' => 'think']);
Db::name('user')->extra('SQL_BUFFER_RESULT')->select();
```
新增單個數據改為使用更清晰和高效的`INSERT SET`語法,例如下面的查詢
```
Db::name('user')->insert(['name' => 'think', 'score' => 100]);
```
實際生成的SQL語句是
```
INSERT INTO user SET `name` = 'think', `score` = 100
```
### 增加`whereFieldRaw`查詢方法
該方法用于對字段使用SQL函數查詢,例如:
```
User::whereFieldRaw('date_format("create_time", "%Y")', '2019')->select();
User::whereFieldRaw('date_format("create_time", "%Y")', '>', '2018')->select();
```
### `Query`類的`update`方法支持獲取模型的更新條件
現在可以直接使用模型的查詢條件作為`Db`類`update`方法的數據更新條件,例如:
```
$user = User::find(1);
$user->field(['name'])->update(['name' => 'thinkphp']);
```
### 數據集類增加快捷查詢(過濾)方法
`think\Collection`類增加`whereLike`/`whereNotLike`/`whereIn`/`whereNotIn`/`whereBetween`/`whereNotBetween`等快捷方法,用于更方便的進行數據篩選而替代使用不夠直觀的`where`方法。
### 增加`optimize:facade`指令
可以在本地開發的時候使用該指令為`Facade`類生成對應類的方法注釋。你只需要在定義Facade類的時候,在類的注釋中添加 `@mixin` 選項,例如使用`@mixin think\Db`注釋后,使用`optimize:facade`指令后,就會在類的注釋中自動生成`think\Db`類的相關`public`方法注釋,方便IDE自動提示,每個類的方法返回值類型最好明確指定(沒有返回值的則使用`void`),否則注釋中會使用`mixed`返回類型。
### 增加新的表達式查詢解析擴展
增加了新的`think\db\Expression`類(原來的`Expression`類已經更改為`Raw`類)用于查詢表達式的擴展解析,你只需要自定義一個表達式解析類,例如:
```
<?php
namespace app\common\expression;
use think\db\Expression;
class Rlike extends Expression
{
/**
* 分析查詢表達式
*
* @param Query $query 查詢對象
* @param string $key
* @param string $exp
* @param string $field
* @param integer $bindType
* @return string
*/
public function parse(Query $query, string $key, string $exp, string $field, int $bindType): string
{
if ($this->value instanceof Raw) {
$value = $this->value->getValue();
} else {
$value = $this->value;
}
return $key .' RLIKE ' . $value ;
}
}
```
現在我們就可以使用下面的查詢語法了:
```
User::where('name', 'rlike', new \app\common\expression\Rlike('^think'))->select();
```
### 提供了關閉事件機制的方法
如果你完全不需要使用事件機制,可以在入口文件中使用`withEvent`方法關閉事件功能。
```
(new App())->withEvent(false)->run()->send();
```
>[danger] 不過值得提醒的是,新版的路由功能、多語言支持和請求緩存功能都是利用了事件機制響應的。
## 用法調整
### 原來`Query`類的`raw`方法移動到`Db`類
雖然用法上沒有改變,但`Db::raw()`方法的調用效率會更高一些。或者你可以直接使用新的助手函數`raw`替代`Db::raw`。
### 原來的`Expression`類改為`Raw`類
原來的`think\db\Expression`類更改為`think\db\Raw`類,更加貼切。
### 多對多關聯的`pivotDataName`方法更名為`name`方法
使用更加簡潔的`name`方法替代原來的`pivotDataName`方法。
## 廢棄用法和參數
### 取消`Query`類的`extend`方法
取消了`Query`類的`extend`方法,如果需要擴展查詢方法,建議自定義`Query`類并繼承系統的`think\db\Query`類即可,然后在模型中定義`query`屬性或者配置數據庫連接的`query`參數為你的自定義類。
### 取消`Request`類的`hook`方法
由于不建議擴展`Request`類的方法,該方法已經在最新版本中取消。
### 取消`URL`參數模式配置
原來的URL參數模式配置參數`url_param_type`,統一使用參數/值的方式。
## 更新日志
* 改進Url類`build`方法
* 修復獲取當前頁碼數據類型
* 修正`parseKey`方法傳入數值的情況
* 改進`optimize:config`指令對`declare`申明的支持
* 取消URL參數模式配置
* 增加`optimize:facade`指令用于生成`facade`類的方法注釋
* 取消`Query`類的`extend`方法
* 原來的`Expression`類更改為`Raw`類
* 增加新的`Expression`類用于表達式查詢擴展
* `Collection`類增加`whereLike`/`whereNotLike`/`whereIn`/`whereNotIn`/`whereBetween`/`whereNotBetween`等快捷方法
* Query類的`raw`方法移動到Db類
* 取消`Request`類的`hook`方法
* 修正`Route::view`方法
* 優化模型獲取器方法
* 多對多關聯的`pivotDataName`方法更名為`name`方法
* Query類增加`partition`/`duplicate`/`extra`方法
* 改進mysql驅動支持分區和`duplicate`以及額外參數
* mysql驅動的`insert`方法改用更清晰的`insert set`語法
* 修正`Event`類`bind`屬性定義
* 修正驗證類的`append`一處bug
* 改進`Query`類`update`方法支持讀取模型的更新條件
* 取消模型類的`getUpdateWhere`方法統一使用`getWhere`方法
* 改進query類的`fetchArray`方法處理
* 改進路由類取消`app`屬性
* 增加`think\facade\RuleName`類
* 增加`whereFieldRaw`查詢方法
* 改進自動多應用名稱獲取
* App類增加`withEvent`方法支持關閉事件機制
* 改進`Dispatch`類對`var_dump`的支持
* 改進`hasMany`的`withCount`自關聯
* 修正純數字檢測參數類型轉換問題
* 修正`raw`助手函數
* `mysql`支持`find_in_set`查詢
* 改進`url`方法對自動多應用的支持
- 值得升級到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