当前位置:网站首页>Eggjs -typeorm 之 TreeEntity 实战
Eggjs -typeorm 之 TreeEntity 实战
2022-07-02 06:21:00 【原小明】
Tree - Entitiy
教程地址
https://typeorm.io/#/tree-entities
案例
场景:分组设计、树设计、菜单设计
树结构 , 括号里是存储的 ID
- 华北(11)
- 河南(14)
- 郑州(17)
- 焦作(18)
- 河北(15)
- 太原(19)
- 华南(12)
- 西南(13)
- 四川(16)
UserGroup
@Entity()
@Tree("closure-table")
export class UserGroup {
@PrimaryGeneratedColumn()
id: number;
@Column({ default: 0 })
status: number;
@CreateDateColumn()
createDate: Date;
@UpdateDateColumn()
updateDate: Date;
@Column()
groupName: string;
@TreeChildren()
children: UserGroup[];
@TreeParent()
parent: UserGroup;
}
UserGroupRepository
@EntityRepository(UserGroup)
export default class UserGroupRepository extends TreeRepository<UserGroup> {
}
1.添加一级节点
代码
const userGroup = new UserGroup()
userGroup.groupName = '华北'
const saveResult = await userGroupRep.save(userGroup)
数据
{
"groupName": "华北",
"id": 11,
"status": 0,
"createDate": "2019-04-20T02:44:48.799Z",
"updateDate": "2019-04-20T02:44:48.799Z"
}
2.添加子节点
添加 四川
代码
const userGroupChild = new UserGroup()
userGroupChild.groupName = '四川'
const parent = await userGroupRep.findOne(13);
if(parent){
userGroupChild.parent = parent
}
await userGroupRep.save(userGroupChild)
数据格式与上面的一致
{
"code": 0,
"msg": "ok",
"data": [
{
"id": 11,
"status": 0,
"createDate": "2019-04-20T02:44:48.799Z",
"updateDate": "2019-04-20T02:44:48.799Z",
"groupName": "华北",
"children": [
{
"id": 14,
"status": 0,
"createDate": "2019-04-20T03:02:58.551Z",
"updateDate": "2019-04-20T03:02:58.551Z",
"groupName": "河南",
"children": [
{
"id": 17,
"status": 0,
"createDate": "2019-04-20T03:08:24.459Z",
"updateDate": "2019-04-20T03:08:24.459Z",
"groupName": "郑州",
"children": []
},
{
"id": 18,
"status": 0,
"createDate": "2019-04-20T03:08:39.077Z",
"updateDate": "2019-04-20T03:08:39.077Z",
"groupName": "焦作",
"children": []
}
]
},
{
"id": 15,
"status": 0,
"createDate": "2019-04-20T03:04:28.248Z",
"updateDate": "2019-04-20T03:04:28.248Z",
"groupName": "河北",
"children": []
}
]
},
{
"id": 12,
"status": 0,
"createDate": "2019-04-20T02:58:51.236Z",
"updateDate": "2019-04-20T02:58:51.236Z",
"groupName": "华南",
"children": []
},
{
"id": 13,
"status": 0,
"createDate": "2019-04-20T02:59:07.329Z",
"updateDate": "2019-04-20T02:59:07.329Z",
"groupName": "西南",
"children": [
{
"id": 16,
"status": 0,
"createDate": "2019-04-20T03:05:34.187Z",
"updateDate": "2019-04-20T03:05:34.187Z",
"groupName": "四川",
"children": []
}
]
}
]
}
3.所有数据嵌套显示
代码
await userGroupRep.findTrees()
数据
{
"code": 0,
"msg": "ok",
"data": [
{
"id": 11,
"status": 0,
"createDate": "2019-04-20T02:44:48.799Z",
"updateDate": "2019-04-20T02:44:48.799Z",
"groupName": "华北",
"children": [
{
"id": 14,
"status": 0,
"createDate": "2019-04-20T03:02:58.551Z",
"updateDate": "2019-04-20T03:02:58.551Z",
"groupName": "河南",
"children": [
{
"id": 17,
"status": 0,
"createDate": "2019-04-20T03:08:24.459Z",
"updateDate": "2019-04-20T03:08:24.459Z",
"groupName": "郑州",
"children": []
},
{
"id": 18,
"status": 0,
"createDate": "2019-04-20T03:08:39.077Z",
"updateDate": "2019-04-20T03:08:39.077Z",
"groupName": "焦作",
"children": []
}
]
},
{
"id": 15,
"status": 0,
"createDate": "2019-04-20T03:04:28.248Z",
"updateDate": "2019-04-20T03:04:28.248Z",
"groupName": "河北",
"children": []
}
]
},
{
"id": 12,
"status": 0,
"createDate": "2019-04-20T02:58:51.236Z",
"updateDate": "2019-04-20T02:58:51.236Z",
"groupName": "华南",
"children": []
},
{
"id": 13,
"status": 0,
"createDate": "2019-04-20T02:59:07.329Z",
"updateDate": "2019-04-20T02:59:07.329Z",
"groupName": "西南",
"children": [
{
"id": 16,
"status": 0,
"createDate": "2019-04-20T03:05:34.187Z",
"updateDate": "2019-04-20T03:05:34.187Z",
"groupName": "四川",
"children": []
}
]
}
]
}
4.只显示根级目录
代码
await userGroupRep.findRoots()
数据
{
"code": 0,
"msg": "ok",
"data": [
{
"id": 11,
"status": 0,
"createDate": "2019-04-20T02:44:48.799Z",
"updateDate": "2019-04-20T02:44:48.799Z",
"groupName": "华北"
},
{
"id": 12,
"status": 0,
"createDate": "2019-04-20T02:58:51.236Z",
"updateDate": "2019-04-20T02:58:51.236Z",
"groupName": "华南"
},
{
"id": 13,
"status": 0,
"createDate": "2019-04-20T02:59:07.329Z",
"updateDate": "2019-04-20T02:59:07.329Z",
"groupName": "西南"
}
]
}
5.指定 Parent 的所有子节点(无嵌套)
代码
const groups = await userGroupRep.findDescendants(parent);
数据
{
"code": 0,
"msg": "ok",
"data": [
{
"id": 11,
"status": 0,
"createDate": "2019-04-20T02:44:48.799Z",
"updateDate": "2019-04-20T02:44:48.799Z",
"groupName": "华北"
},
{
"id": 14,
"status": 0,
"createDate": "2019-04-20T03:02:58.551Z",
"updateDate": "2019-04-20T03:02:58.551Z",
"groupName": "河南"
},
{
"id": 15,
"status": 0,
"createDate": "2019-04-20T03:04:28.248Z",
"updateDate": "2019-04-20T03:04:28.248Z",
"groupName": "河北"
},
{
"id": 17,
"status": 0,
"createDate": "2019-04-20T03:08:24.459Z",
"updateDate": "2019-04-20T03:08:24.459Z",
"groupName": "郑州"
},
{
"id": 18,
"status": 0,
"createDate": "2019-04-20T03:08:39.077Z",
"updateDate": "2019-04-20T03:08:39.077Z",
"groupName": "焦作"
}
]
}
6.指定 Parent 的所有子节点(嵌套)
代码
await userGroupRep.findDescendantsTree(parent);
数据
{
"code": 0,
"msg": "ok",
"data": {
"id": 11,
"status": 0,
"createDate": "2019-04-20T02:44:48.799Z",
"updateDate": "2019-04-20T02:44:48.799Z",
"groupName": "华北",
"children": [
{
"id": 14,
"status": 0,
"createDate": "2019-04-20T03:02:58.551Z",
"updateDate": "2019-04-20T03:02:58.551Z",
"groupName": "河南",
"children": [
{
"id": 17,
"status": 0,
"createDate": "2019-04-20T03:08:24.459Z",
"updateDate": "2019-04-20T03:08:24.459Z",
"groupName": "郑州",
"children": []
},
{
"id": 18,
"status": 0,
"createDate": "2019-04-20T03:08:39.077Z",
"updateDate": "2019-04-20T03:08:39.077Z",
"groupName": "焦作",
"children": []
}
]
},
{
"id": 15,
"status": 0,
"createDate": "2019-04-20T03:04:28.248Z",
"updateDate": "2019-04-20T03:04:28.248Z",
"groupName": "河北",
"children": []
}
]
}
}
7.指定 Parent 的子节点数量
代码
const groups = await userGroupRep.countDescendants(parent);
数据
{
"code": 0,
"msg": "ok",
"data": 5
}
8.指定 Parent 的父节点相关操作
无嵌套数据:userGroupRep.findAncestors()
嵌套数据:userGroupRep.findAncestorsTree()
父节点数量:userGroupRep.countAncestors()
9.指定每个节点条件相关操作
const childrens = await repository
.createDescendantsQueryBuilder("category", "categoryClosure", parentCategory)
.andWhere("category.type = 'secondary'")
.getMany();
边栏推荐
- 深入学习JVM底层(五):类加载机制
- LeetCode 90. 子集 II
- Does the assignment of Boolean types such as tag attribute disabled selected checked not take effect?
- The difference between session and cookies
- Contest3147 - game 38 of 2021 Freshmen's personal training match_ 1: Maximum palindromes
- 链表(线性结构)
- BGP routing optimization rules and notification principles
- Zhuanzhuanben - LAN construction - Notes
- Golang -- map capacity expansion mechanism (including source code)
- MySql索引
猜你喜欢
Contest3147 - game 38 of 2021 Freshmen's personal training match_ G: Flower bed
日期时间API详解
Singleton mode compilation
In depth understanding of JUC concurrency (II) concurrency theory
js中正则表达式的使用
Contest3145 - the 37th game of 2021 freshman individual training match_ H: Eat fish
State machine in BGP
深入了解JUC并发(二)并发理论
Linear DP (split)
Support new and old imperial CMS collection and warehousing tutorials
随机推荐
最新CUDA环境配置(Win10 + CUDA 11.6 + VS2019)
DeprecationWarning: .ix is deprecated. Please use.loc for label based indexing or.iloc for positi
LeetCode 78. 子集
CUDA用户对象
The difference between session and cookies
Contest3147 - game 38 of 2021 Freshmen's personal training match_ A: chicken
【每日一题】写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
MySQL的10大经典错误
LeetCode 39. 组合总和
亚马逊aws数据湖工作之坑1
一起学习SQL中各种join以及它们的区别
利用传统方法(N-gram,HMM等)、神经网络方法(CNN,LSTM等)和预训练方法(Bert等)的中文分词任务实现
Redis - hot key issues
Invalid operation: Load into table ‘sources_orderdata‘ failed. Check ‘stl_load_errors‘ system table
Decryption skills of encrypted compressed files
RestTemplate请求时设置请求头,请求参数,请求体。
找到页面当前元素z-index最高的数值
The Chinese word segmentation task is realized by using traditional methods (n-gram, HMM, etc.), neural network methods (CNN, LSTM, etc.) and pre training methods (Bert, etc.)
eslint配置代码自动格式化
Sentinel规则持久化到Nacos