皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

ThinkPHP 发布 5.2 RC1 版本,诸多查询改进

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 表分了 p1p2 两个分区,你可以使用下面的查询:

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 方法支持获取模型的更新条件

现在可以直接使用模型的查询条件作为 Dbupdate 方法的数据更新条件,例如:

$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 语法
  • 修正 Eventbind 属性定义
  • 修正验证类的 append 一处 bug
  • 改进 Queryupdate 方法支持读取模型的更新条件
  • 取消模型类的 getUpdateWhere 方法统一使用 getWhere 方法
  • 改进 query 类的 fetchArray 方法处理
  • 改进路由类取消 app 属性
  • 增加 think\facade\RuleName
  • 增加 whereFieldRaw 查询方法
  • 改进自动多应用名称获取
  • App 类增加 withEvent 方法支持关闭事件机制
  • 改进 Dispatch 类对 var_dump 的支持
  • 改进 hasManywithCount 自关联
  • 修正纯数字检测参数类型转换问题
  • 修正 raw 助手函数
  • mysql 支持 find_in_set 查询
  • 改进 url 方法对自动多应用的支持

转自 https://www.oschina.net/news/104439/thinkphp-5-2-rc1-released

分享到:更多 ()