### 2018 年 10 月 28 日 发布 该版本主要修正了上一个版本存在的一些问题,并改进了关联查询部分。支持上一个版本的无缝升级! ## 主要更新 * 聚合查询方法的字段支持`DISTINCT` * 修正定义路由后`url`函数的端口支持 * 修正控制器中间件对`swoole`的支持 * 改进Log类`save`方法 * 改进验证类的闭包验证参数 * 多对多关联支持指定中间表数据的名称 * 关联聚合查询支持闭包方式指定聚合字段 * 改进Lang类`get`方法 * 多对多关联增加判断关联数据是否存在的方法 * 改进关联查询使用`fetchsql`的情况 * 改进修改器的是否已经执行判断 * 增加`afterWith`和`beforeWith`验证规则 用于比较日期字段 ## 新版特性 ### 控制器中间件改进 由于Swoole等模式下,类库常驻内存,控制器中间件第二次将不会执行,现在控制器中间件的执行过程不再纳入架构函数。 ### 模型改进 改进了修改器是否执行的判断逻辑,如果没有定义修改器方法,允许对模型数据的多次赋值。这样,可以方便在模型事件中对数据进行修改。 聚合查询的字段支持使用`DISTINCT`,例如: ``` User::count('DISTINCT id'); ``` 关联聚合查询使用闭包的时候支持指定聚合字段 ``` User::withCount(['book' => function($query){ // 统计今年出版的书的数量 并且使用books_num作为统计字段返回 $query->whereTime('publish_time', 'y'); return 'books_num'; })->select(); ``` 针对多对多关联,还可以支持下面的用法 ``` use think\Model; class User extends Model { public function roles() { // 使用pivotDataName方法指定中间表的数据对象名称 return $this->belongsToMany('role')->pivotDataName('userRole'); } } ``` ``` $user = User::get(1); $role = Role::getByName('editor'); // 判断关联数据是否存在 如果存在则返回中间表对象 $pivot = $user->roles()->attached($role); ``` 同时修正了当关联查询使用`fetchSql`方法导致的错误。 ### 验证规则改进 验证规则如果使用了闭包,现在可以增加额外的参数,包括 ``` // 新增的参数包括title(规则标题)和validate(当前验证对象) function($value, $data, $title, $validate) { } ``` 额外新增了`beforeWith`和`afterWith`两个验证规则,用于比较多个日期字段的数据。 ~~~ $validate = Validate::make([ 'start_time' => 'require|beforeWith:end_time', 'end_time' => 'require|afterWith:start_time' ]); if (!$validate->check($data)) { dump($validate->getError()); } ~~~ ## 扩展更新 此次更新还包含了一些官方扩展的更新: * 增加`SeasLog`日志扩展[`think-seaslog`](https://github.com/top-think/think-seaslog); * [`Swoole`扩展](https://github.com/top-think/think-swoole)更新至`2.0.14`版本; * [单元测试扩展](https://github.com/top-think/think-testing)更新至`2.0.5`版本;