要想写出的代码同时兼容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`方式进行关联查询。