5.2
在经过几个月的测试版本迭代后,正式进入候选版本。之后的重点工作会是扩展以及文档的完善。当然,不排除核心还有微调的可能。
ThinkPHP5.2RC1
版本继上个版本beta3
版本发布以来,主要更新如下:
新特性
支持FIND_IN_SET
查询
增加了新的查询表达式对FIND_IN_SET
的支持,使用下面的查询即可:
Db::name('user')->where('group_list', 'find in set', 2)->select();
增加了分区查询支持
增加了对分区的支持(需要MySQL5.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();
不过值得提醒的是,新版的路由功能、多语言支持和请求缓存功能都是利用了事件机制响应的。
用法调整
原来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
方法对自动多应用的支持
转自 https://www.oschina.net/news/104439/thinkphp-5-2-rc1-released