CD's blog CD's blog
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

CD_wOw

内卷的行情,到不了的梦
首页
  • HTMLCSS
  • JavaScript
  • Vue
  • TypeScript
  • React
  • Node
  • Webpack
  • Git
  • Nestjs
  • 小程序
  • 浏览器网络
  • 学习笔记

    • 《TypeScript 从零实现 axios》
    • Webpack笔记
  • JS/TS教程

    • 《现代JavaScript》教程
🔧工具方法
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Nestjs如何做登陆鉴权
  • Nestjs如何接入Redis
  • Nestjs typeorm 如何联查没有关联关系的实体
    • 使用 leftJoinAndMapOne 或 leftJoinAndMapMany 映射属性
  • Nestjs接入nodemailer并通过QQ邮箱发送邮件步骤
  • Nestjs笔记
CD
2023-03-27
目录

Nestjs typeorm 如何联查没有关联关系的实体

笔记

很多时候我们在写 sql 表的时候,外键因为有诸多限制不被推荐使用,所以大部分的都是无关系的表连接,所以,下面总结两钟联查的方法以供选择。

下面先定义两张表 User 表

@Entity({ name: "user", schema: "public" })
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ nullable: false })
  name: string;

  @Column({
    type: "text",
    nullable: false,
  })
  desc: string;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

与 user 关联的表 - 其内的 userId 对应 user 表的主键 userRole

@Entity({ name: "userRole", schema: "public" })
export class UserRole {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ nullable: false })
  userId: number;

  @Column({ nullable: false })
  name: string;
}
1
2
3
4
5
6
7
8
9
10
11

# 采用 getRawOne 重置原始数据

通过左联 leftJoinAndSelect 找到数据后通过 getRawOne 将所有数据变为原始数据,再通过 select 重新编排得出结果

首先我们需要在 imports 导入我们两张表

@Module({
  imports: [TypeOrmModule.forFeature([User, UserRole])],
  ...
})
1
2
3
4

然后在 service 文件中书写:

// ...
constructor(@InjectRepository(User) private readonly userRepository: Repository<User>){}
return this.userRepository
  .createQueryBuilder('user')
  .leftJoinAndSelect(UserRole, 'role', 'user.id = role.userId')
  .select(
    `
        user.roles as role,
        user.id as userId,
        user.nickname as nickname,
        user.username as usernmae,
        user.avator as avator,
      `,
  )
  .getRawMany();
// ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 使用 leftJoinAndMapOne 或 leftJoinAndMapMany 映射属性

constructor(@InjectRepository(User) private readonly userRepository: Repository<User>){}
return this.userRepository
  .createQueryBuilder('user')
  .leftJoinAndMapOne('user.role',UserRole, 'role', 'user.id=role.userId')
  .getManyAndCount();
1
2
3
4
5
编辑 (opens new window)
#Nestjs
上次更新: 2023/03/27, 22:09:34
Nestjs如何接入Redis
Nestjs接入nodemailer并通过QQ邮箱发送邮件步骤

← Nestjs如何接入Redis Nestjs接入nodemailer并通过QQ邮箱发送邮件步骤→

最近更新
01
gsap动画库学习笔记 - 持续~
06-05
02
远程组件加载方案笔记
05-03
03
小程序使用笔记
03-29
更多文章>
Theme by Vdoing | Copyright © 2020-2023 CD | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式