要想写出的代码同时兼容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库管理
- 提升网站速度
- 七牛云
- 七牛云插件配置
- 原图保护
- 七牛图片处理
- 防止百度移动端转码