Skip to content

数据库中 一对一关系

一对一

一对一关系,是指两个实体之间,一个实体的实例与另一个实体的实例之间,存在唯一的一对一关系。这种关系通常用于表示两个实体之间的紧密关联,其中一个实体是另一个实体的唯一标识。

记法

写关系的时候先写引荐 ID,然后再写外联 ID

表里面定义

ts
// 第一张表
model tb_user {
  id          Int          @id @default(autoincrement())
  name        String?      @db.VarChar(10)
  age         Int?
  gender      String?      @db.Char(1)
  phone       String?      @db.Char(11)
  tb_user_edu tb_user_edu?
}
// 第二张表
model tb_user_edu {
  id            Int      @id @default(autoincrement())
  degree        String?  @db.VarChar(20)
  major         String?  @db.VarChar(50)
  primaryschool String?  @db.VarChar(50)
  middleschool  String?  @db.VarChar(50)
  university    String?  @db.VarChar(50)
  userid        Int?     @unique(map: "userid")
  tb_user       tb_user? @relation(fields: [userid], references: [id])
}
  • 一个用户可以有0个或者一个配置文件 因为 user 表里面 tb_user_edu 是选填的

查询语法

注意

注意

  1. include 不能和 select 同级别
ts
  // 5. 1对1查询,返回所有字段
  async onebyone() {
    const result = await this.prismadbService.tb_user.findMany({
      include: {
        tb_user_edu: true,
      },
    });
    return result;
  }

返回筛选的数据

ts
  // 5. 1对1查询 过滤
  async onebyonefilter() {
    const result = await this.prismadbService.tb_user.findMany({
      select: {
        name: true,
        tb_user_edu: {
          select: {
            primaryschool: true,
            middleschool: true,
            university: true,
          },
        },
      },
    });
    return result;
  }

使用 include 查询 配合条件返回指定的数据

ts
  // 5. 1对1查询 过滤第二种写法 , include 与 select 不能同级使用
  async onebyonefilter2() {
    const result = await this.prismadbService.tb_user.findMany({
      where: {
        age: {
          gte: 40,
        },
      },
      include: {
        tb_user_edu: {
          select: {
            primaryschool: true,
            middleschool: true,
          },
        },
      },
    });
    return result;
  }

插入语法

  • 没有写外键约束的时候
ts
  async insertonebyone() {
    const result = await this.prismadbService.tb_user.create({
      data: {
        name: '阿里',
        age: 60,
        gender: '1',
        phone: '13800138000',
      },
    });
    return result;
  }