数据库中 一对一关系
一对一
一对一关系,是指两个实体之间,一个实体的实例与另一个实体的实例之间,存在唯一的一对一关系。这种关系通常用于表示两个实体之间的紧密关联,其中一个实体是另一个实体的唯一标识。
记法
写关系的时候先写引荐 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
是选填的
查询语法
注意
注意
- 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;
}