要想寫出的代碼同時兼容5.1和6.0并不難,CMF已經在核心層做了很多兼容性的工作,最大問題是數據庫和模型相關的用法要做一些兼容性處理,其實就是寫代碼時只用兩個版本都能兼容的用法就可以了。
[TOC=2,6]
## **最簡單的兼容性處理**
### 根據CMF版本號做相應兼容性處理
通過`cmf_version()`函數獲取CMF版本號,并增加相應版本下的處理邏輯
~~~
if (strpos(cmf_version(), '6.') === 0) {
//這里寫6.0的處理邏輯
} else {
//這里寫5.1的處理邏輯
}
~~~
## **數據庫和模型**
### 不建議使用Db去操作數據庫
建議統一使用模型去操作數據庫
### 模型統一設置模型名
模型里都指定這個模型的`$name`屬性,如`UserModel`
~~~
<?php
namespace app\user\model;
use think\Model;
class UserModel extends Model
{
/**
* 模型名稱,不帶前綴的表名,每個模型都要指定這個屬性
* @var string
*/
protected $name = 'user';
/*此處省略1000行...*/
}
~~~
### 取消`setInc`/`setDec`方法
取消Query類的`setInc`/`setDec`方法,統一使用`inc`/`dec`方法替代。例如:
~~~
Db::name('user')->where('id', 1)
->inc('exp')
->dec('score')
->update();
~~~
### 取消`join`方法的批量操作
`join`方法不再支持批量操作多個表,如果你使用了`join`方法批量操作,需要改成每個表單獨調用一次`join`方法。
### 取消`setField`方法
取消Query類的`setField`方法,請直接使用`data`方法或者`update`方法。
### 取消`__TABLE_NAME__`支持
`table`方法取消`__TABLE_NAME__`支持,必須明確調用完整表名或者使用`name`方法。
### 取消`whereOr`等方法傳入`Query`對象
因為`Query`對象查詢只能使用一次,除了`where`方法本身可以傳入`Query`對象外,其它的所有`where`查詢方法(例如`whereOr`/`whereExp`等)都不再支持傳入`Query`對象。
### 取消`resultset_type`配置參數
數據集查詢結果不再受`resultset_type`配置參數影響,默認情況下,Db查詢統一返回數組,模型查詢統一返回模型對象和模型數據集對象。如果Db查詢的時候也需要返回數據集的話,可以顯式調用`fetchCollection`方法。
### 取消`Query`類的`extend`方法
取消了`Query`類的`extend`方法,如果需要擴展查詢方法,建議自定義`Query`類并繼承系統的`think\db\Query`類即可,然后在模型中定義`query`屬性或者配置數據庫連接的`query`參數為你的自定義類。
### `Expression`對象調整
原來的`Expression`對象已經更改為更適合的`Raw`對象,但不影響`Db::raw()`方法的調用。
### 取消查詢`eq/neq/gt/lt/egt/elt`表達式
由于存在兩種用法,并且不夠直觀,全部統一為更直觀的用法。
下面的用法不再支持
~~~
Db::name('user')->where('id', 'egt', 1)
->where('status', 'neq' ,1)
->select();
~~~
統一使用
~~~
Db::name('user')->where('id', '>=', 1)
->where('status', '<>' ,1)
->select();
~~~
### 取消分表功能
出于分表的性能問題和復雜性,不再提供分表方法,建議使用數據庫的分區功能替代。新版可以使用`partition`方法指定當前查詢的分區。
### 數據庫的查詢統計合并
數據庫的查詢次數合并到`queryTimes`,不再區分讀寫操作,你可以使用下面的方法獲取當前請求的數據庫查詢次數(包括讀寫)
~~~
Db::getQueryTimes();
~~~
### 取消了模型的`get`/`all`方法
無論使用`Db`類還是模型類查詢,全部統一使用`find`/`select`方法,取消了之前模型類額外提供的`get`/`all`方法。同時取消的方法還包括`getOrFail`/`allOrFail`。
### 取消全局查詢范圍`base`方法
取消模型類的全局查詢范圍`base`方法,改由使用`globalScope`屬性定義(數組)需要全局查詢的查詢范圍方法。
### 模型`save`方法調整
模型類的`save`方法不再支持`where`參數。
### 關聯統計調整
如果你的關聯統計使用了閉包方式返回關聯統計字段,需要調整為如下方式:
```
User::withCount(['cards' => function($query,&$name) {
$query->where('status', 1);
$name = 'card_count';
}])->select();
```
### 模型和數據集的輸出調整
取消`hidden`/`visible`/`append`方法的第二個參數,當你調用這幾個方法的時候,無論模型是否設置了相關屬性,都會直接覆蓋之前設置的值。
### 查詢緩存調整
如果希望在更新和刪除之后自動清除之前的查詢緩存,必須在`cache`方法中傳入key值而不是`true`。
### 刪除關聯類`selfRelation`方法
如果你在定義關聯的時候使用了`selfRelation`方法,請直接刪除該方法,目前已經不再需要,會自動識別是否為自關聯。
### 刪除關聯類的`setEagerlyType`方法
一對一關聯無需在定義關聯的時候指定為`JOIN`查詢,在查詢的時候直接使用`withJoin`方法即可使用`JOIN`方式進行關聯查詢。
- 序言
- 運行環境
- nginx rewrite
- apache rewrite
- IIS rewrite
- MAC開發
- HTTPS配置
- 更安全的nginx配置
- 關閉調試模式
- 6.0調試模式
- 開發工具
- 郵箱配置
- 163郵箱配置
- QQ郵箱配置
- 安裝門戶應用
- 5.1及以前版本安裝
- 驗證碼問題
- 遷移到正式環境
- 支持虛擬機
- 5.0支持虛擬機
- 5.1支持虛擬機
- 如何保證代碼同時兼容5.1和6.0
- 站群部署
- 部署原理
- 如何使用CMF做商業軟件
- 商業化使用概述
- 去除界面上的ThinkCMF
- 更改前后臺默認模板
- 定制安裝應用
- 讓應用自動安裝
- 更改默認核心的邏輯
- 忘記后臺密碼
- 后臺地址是?
- 插件安裝
- 模板安裝
- 更換后臺主題
- 關閉數字驗證碼
- 獲取前臺用戶信息
- 獲取當前管理員
- 引入第三方庫
- 分頁參數丟失
- 什么是數據集?
- 基類你理解了嗎?
- 你的后臺菜單管理正確嗎?
- 安裝API模塊
- 持續升級
- 面包屑為什么空?
- composer庫管理
- 提升網站速度
- 七牛云
- 七牛云插件配置
- 原圖保護
- 七牛圖片處理
- 防止百度移動端轉碼