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

栏目: 软件资讯 · 发布时间: 7年前

内容简介:5.2在经过几个月的测试版本迭代后,正式进入候选版本。之后的重点工作会是扩展以及文档的完善。当然,不排除核心还有微调的可能。 ThinkPHP5.2RC1版本继上个版本beta3版本发布以来,主要更新如下: 新特性 支持F...

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方法对自动多应用的支持


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Hit Refresh

Hit Refresh

Satya Nadella、Greg Shaw / HarperBusiness / 2017-9-26 / USD 20.37

Hit Refresh is about individual change, about the transformation happening inside of Microsoft and the technology that will soon impact all of our lives—the arrival of the most exciting and disruptive......一起来看看 《Hit Refresh》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码