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

| 名称 | 说明 |
|---|---|
| with.posts | 关系名 |
| $relationDynamic.hasMany | 定义1:n关系 |
| ModelPost | 目标Model |
| 'userId' | 外键 |
| aggrs | 需要聚合的函数和字段。函数:count/sum/avg/min/max。字段:string/string[] |
静态关系
1. 定义关系
为了演示起见,新建一个 Model UserStats,定义一个静态关系posts
typescript
@Model({
entity: EntityUser,
relations: {
posts: $relation.hasMany(() => ModelPost, 'userId', {
aggrs: {
count: '*',
sum: 'stars',
},
}),
},
})
class ModelUserStats {}2. 使用关系
typescript
class ServiceUser {
async relationAggregate() {
const users = await this.scope.model.userStats.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,
aggrs: {
count: '*',
sum: 'stars',
},
}),
},
})
class ModelUserStats {}2. 使用关系
typescript
class ServiceUser {
async relationAggregate() {
const users = await this.scope.model.userStats.select();
return users;
}
}