基于关系的分组 
下面以模块test-vona为例,讲解基于关系的分组的用法
比如,Model User 和 Model Post 是1:n的关系。当我们在查询 User 数据时,可以基于关系查询相应 Post 的分组数据
动态关系 
typescript
class ServiceUser {
  async relationGroup() {
    const users = await this.scope.model.user.select({
      with: {
        posts: $relationDynamic.hasMany(() => ModelPost, 'userId', {
          groups: 'id',
          aggrs: {
            count: '*',
            sum: 'stars',
          },
        }),
      },
    });
    return users;
  }
}Vona ORM 自动推断出users的类型

| 名称 | 说明 | 
|---|---|
| with.posts | 关系名 | 
| $relationDynamic.hasMany | 定义1:n关系 | 
| ModelPost | 目标Model | 
| 'userId' | 外键 | 
| groups | 需要分组的字段:string/string[] | 
| columns | 需要显示的分组字段。如果为空,则显示参数groups指定的字段 | 
| aggrs | 需要聚合的函数和字段。函数:count/sum/avg/min/max。字段:string/string[] | 
静态关系 
1. 定义关系 
为了演示起见,新建一个 Model UserStatsGroup,定义一个静态关系posts
typescript
@Model({
  entity: EntityUser,
  relations: {
    posts: $relation.hasMany(() => ModelPost, 'userId', {
      groups: 'id',
      aggrs: {
        count: '*',
        sum: 'stars',
      },
    }),
  },
})
class ModelUserStatsGroup {}2. 使用关系 
typescript
class ServiceUser {
  async relationGroup() {
    const users = await this.scope.model.userStatsGroup.select({
      include: {
        posts: true,
      },
    });
    return users;
  }
}Vona ORM 自动推断出users的类型

autoload 
也可以将静态关系设为autoload: true,从而实现自动加载,也可以让代码进一步简化
1. 定义关系 
diff
@Model({
  entity: EntityUser,
  relations: {
    posts: $relation.hasMany(() => ModelPost, 'userId', {
+     autoload: true,
      groups: 'id',
      aggrs: {
        count: '*',
        sum: 'stars',
      },
    }),
  },
})
class ModelUserStatsGroup {}2. 使用关系 
typescript
class ServiceUser {
  async relationGroup() {
    const users = await this.scope.model.userStatsGroup.select();
    return users;
  }
}