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

栏目: PHP · 发布时间: 5年前

内容简介:ThinkPHP5.2增加了新的查询表达式对

5.2 在经过几个月的测试版本迭代后,正式进入候选版本。之后的重点工作会是扩展以及文档的完善。当然,不排除核心还有微调的可能。

ThinkPHP5.2 RC1 版本继上个版本 beta3 版本 发布以来,主要更新如下:

新特性

支持 FIND_IN_SET 查询

增加了新的查询表达式对 FIND_IN_SET 的支持,使用下面的查询即可:

Db::name('user')->where('group_list', 'find in set', 2)->select();

增加了分区查询支持

增加了对分区的支持(需要MySQL 5.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 方法对自动多应用的支持


以上所述就是小编给大家介绍的《ThinkPHP 发布 5.2 RC1 版本,诸多查询改进》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

离心力:互联网历史与数字化未来

离心力:互联网历史与数字化未来

[英] 乔尼·赖安(Johnny Ryan) / 段铁铮 / 译言·东西文库/电子工业出版社 / 2018-2-1 / 68.00元

★一部详实、严谨的互联网史著作; ★哈佛、斯坦福等高校学生必读书目; ★《互联网的未来》作者乔纳森·L. 齐特雷恩,《独立报》《爱尔兰时报》等知名作者和国外媒体联合推荐。 【内容简介】 虽然互联网从诞生至今,不过是五六十年,但我们已然有必要整理其丰富的历史。未来的数字世界不仅取决于我 们的设想,也取决于它的发展历程,以及互联网伟大先驱们的理想和信念。 本书作者乔尼· ......一起来看看 《离心力:互联网历史与数字化未来》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具