美文网首页
TypeORM 无关联关系的mysql多表连接查询

TypeORM 无关联关系的mysql多表连接查询

作者: 希硕 | 来源:发表于2021-10-23 16:32 被阅读0次

  TypeORM 官方给的文档中,多表查询时使用的是通过实体关系进行leftjoin查询,我们知道TypeORM实体关系实际上是通过mysql的外键实现的。在实际开发中,外键因为有诸多限制不被推荐使用,大部分的都是无关系的表连接。经过几天的查找资料和摸索,找到了两种查询的方法,总结一下,如果大家有其他好的方法,欢迎留言讨论。

定义实体类

User 实体
import { Entity, Column, PrimaryColumn } from 'typeorm';
@Entity()
export class User {
  @PrimaryColumn()
  id: string;

  @Column()
  nickname: string;

  @Column()
  gender: number;

  @Column()
  avatarUrl: string;

  @Column()
  language: string;

  @Column()
  country: string;

  @Column()
  province: string;

  @Column()
  city: string;
}
Role 实体类
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Role {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  roleId: number;

  @Column()
  userId: string;
}
Role_dic 实体类
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Role_dic {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  roleId: number;

  @Column()
  roleName: string;
}
表关系
user.id = role.userId  role.roleId = role_dic.roleId

User service查询的两种方式

方法一
    // 查询语句
    let queryBuilder = this.connection.createQueryBuilder(User, 'user');
    const user = await queryBuilder
    .leftJoinAndSelect(Role, 'role', 'role.userId = user.id')
    .leftJoinAndSelect(Role_dic, 'role_dic', 'role_dic.roleId = role.roleId')
    .where("user.id = :id", { id: userId })
    .select(`
      user.id as id,
      user.nickname as nickname,
      user.gender as gender,
      user.avatarUrl as avatarUrl,
      user.language as language,
      user.country as country,
      user.province as province,
      user.city as city,
      role.roleId as roleId,
      role_dic.roleName as roleName
    `)
    .getRawOne();

// 返回结果
{
    "id": "1630404672291",
    "nickname": "xiaoditian",
    "gender": 1,
    "avatarUrl": "mytouxiang",
    "language": "cn",
    "country": "china",
    "province": "henan",
    "city": "zhengzhou",
    "roleId": 1,
    "roleName": "管理员"
}

  这种方法使用getRawOne获取到sql查询后的原始数据,因为TypeORM会用别名,所以这里用select对字段进行了重命名,这个写法需要对每个需要的字段名进行重命名,否则返回的字段名称会带上表名。

方法二
//查询语句
let queryBuilder = this.connection.createQueryBuilder(User, 'user');
const user = await queryBuilder
      .leftJoinAndMapOne('user.role', Role, 'role', 'role.userId = user.id')
      .leftJoinAndMapOne('role.roleDic', Role_dic, 'role_dic', 'role_dic.roleId = role.roleId')
      .where("user.id = :id", { id: userId })
      .getOne();
//返回结果

{
    "id": "1630404672291",
    "nickname": "xiaoditian",
    "gender": 1,
    "avatarUrl": "mytouxiang",
    "language": "cn",
    "country": "china",
    "province": "henan",
    "city": "zhengzhou",
    "role": {
        "id": 1,
        "roleId": 1,
        "userId": "1630404672291",
        "roleDic": {
            "id": 1,
            "roleId": 1,
            "roleName": "管理员"
        }
    }
}

  第二种方法使用leftJoinAndMapOne作字段映射,如果一对多可以使用leftJoinAndMapMany。这样就不用挨个对字段重命名,但是可能存在嵌套较深的问题。

总结

  以上是常用的两种表连接的方法,每个都有其优缺点,可以根据情况选择使用。两外附上这两种方法的出处:
1、https://juejin.cn/post/6916483483095449608
2、https://www.cnblogs.com/zzk96/p/11397223.html

相关文章

  • TypeORM 无关联关系的mysql多表连接查询

      TypeORM 官方给的文档中,多表查询时使用的是通过实体关系进行leftjoin查询,我们知道TypeORM...

  • python面试题01

    1、什么是多表关联查询,有几种多表关联的查询方式,分别是什么? 多表关联查询概念: 多表关联查询分类:1.1内连接...

  • 深入浅出MySQL(五)

    多表查询 MySQL中的多表联查 MySQL中多表查询分为三种形式: 笛卡尔积的形式 内连接的形式 外连接的形式 ...

  • Oracle连接_子查询

    多表查询:多张表关联在一起进行查询,在多表查询中会频繁的使用表的别名。连接:内连接(等值连接):select 列名...

  • MySql(五)多表查询

    对于多表查询的前提:这些关联的数据表之间存在有关系(字段、某些条件) 多表查询就是求出多个表的乘积,例如t1连接t...

  • 如何在EF中实现left join(左联接)查询

    在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句...

  • Spring Data JPA实现动态多表关联查询

    在面向关系型数据库(例如:MySQL)的查询中,动态的、多表关联的查询属于比较复杂的情况。所以,我们只要掌握了这种...

  • 多表联合查询

    MySQL中基本的多表连接查询教程Mysql脚本之家 var tougao="goldensun";var lmn...

  • mysql---连接查询

    连接查询(多表查询)内连接外连接---左外连接---右外连接 前提条件:多张表之间要存在相关联的字段 内连接 特征...

  • mysql使用 from两表查询与join两表查询区别

    在mysql中,多表连接查询是很常见的需求,在使用多表查询时,可以from多个表,也可以使用join连接连个表这两...

网友评论

      本文标题:TypeORM 无关联关系的mysql多表连接查询

      本文链接:https://www.haomeiwen.com/subject/jsakaltx.html