如何在 Prisma 模式中表示额外的关系列?
How can I represent extra relation columns in a Prisma schema?
我正在使用 Prisma 3.7.0 和 Postgresql 13。我需要在具有一些额外数据的两个模型之间创建多对多关系,但我不知道如何在 Prisma 中执行此操作模式。我要添加的字段没有适当地添加到 table.
这里有一些简化的(人为的)SQL 来说明目标:
在 SQL 中非常简单,但我不太了解 Prisma 文档中的操作方法。
CREATE TABLE animal (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL -- e.g. "tiger" or "armadillo"
)
CREATE TABLE animal_bodyparts (
animal INT,
bodypart INT,
-- I want to add these two fields to the relation.
count INT, -- How many of this bodypart the animal has
is_vital BOOLEAN, -- Does the creature die if this part is damaged?
PRIMARY KEY (animal, bodypart)
CONSTRAINT fk_animal FOREIGN KEY (animal) REFERENCES animal(id),
CONSTRAINT fk_bodypart FOREIGN KEY (bodypart) REFERENCES bodypart(id)
)
CREATE TABLE bodypart (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL -- e.g. "head" or "leg"
)
到目前为止,这是我使用 Prisma 得出的最佳结果:
model Animal {
id Int @id @default(autoincrement)
name String // e.g. "tiger" or "armadillo"
parts BodyPart[]
}
model BodyPart {
id Int @id @default(autoincrement)
name String // e.g. "head" or "leg"
animals Animal[]
}
但是我应该将 count
和 is_vital
列放在 Prisma 模型中的什么位置?我看到在一对多关系中有一些方法可以通过 @relation
标签添加一些信息,但我 认为 没有解决这个需求。
您可以按照以下方式进行:
datasource mysql {
provider = "mysql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
generator erd {
provider = "prisma-erd-generator"
output = "entity-relationship-diagram.svg"
}
model Animal {
id Int @id @default(autoincrement())
name String
animalAndBodyParts AnimalAndBodyParts[] @relation()
}
model AnimalAndBodyParts {
id Int @id @default(autoincrement())
count Int
isVital Boolean @map("is_vital")
animal Animal @relation(fields: [animalId], references: [id])
animalId Int
bodyPart BodyPart @relation(fields: [bodyPartId], references: [id])
bodyPartId Int
}
model BodyPart {
id Int @id @default(autoincrement())
name String
animalAndBodyParts AnimalAndBodyParts[] @relation()
}
它将生成一个数据库,如图所示:
您可以这样保存数据:
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
const saveData = async () => {
const animal = await prisma.animal.create({
data: {
name: 'Lion',
animalAndBodyParts: {
create: {
count: 2,
isVital: true,
bodyPart: {
create: {
name: 'Eye',
},
},
},
},
},
include: {
animalAndBodyParts: {
include: {
bodyPart: true,
},
},
},
})
console.log(JSON.stringify(animal, null, 2));
}
saveData()
数据如下图所示
我正在使用 Prisma 3.7.0 和 Postgresql 13。我需要在具有一些额外数据的两个模型之间创建多对多关系,但我不知道如何在 Prisma 中执行此操作模式。我要添加的字段没有适当地添加到 table.
这里有一些简化的(人为的)SQL 来说明目标:
在 SQL 中非常简单,但我不太了解 Prisma 文档中的操作方法。
CREATE TABLE animal (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL -- e.g. "tiger" or "armadillo"
)
CREATE TABLE animal_bodyparts (
animal INT,
bodypart INT,
-- I want to add these two fields to the relation.
count INT, -- How many of this bodypart the animal has
is_vital BOOLEAN, -- Does the creature die if this part is damaged?
PRIMARY KEY (animal, bodypart)
CONSTRAINT fk_animal FOREIGN KEY (animal) REFERENCES animal(id),
CONSTRAINT fk_bodypart FOREIGN KEY (bodypart) REFERENCES bodypart(id)
)
CREATE TABLE bodypart (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL -- e.g. "head" or "leg"
)
到目前为止,这是我使用 Prisma 得出的最佳结果:
model Animal {
id Int @id @default(autoincrement)
name String // e.g. "tiger" or "armadillo"
parts BodyPart[]
}
model BodyPart {
id Int @id @default(autoincrement)
name String // e.g. "head" or "leg"
animals Animal[]
}
但是我应该将 count
和 is_vital
列放在 Prisma 模型中的什么位置?我看到在一对多关系中有一些方法可以通过 @relation
标签添加一些信息,但我 认为 没有解决这个需求。
您可以按照以下方式进行:
datasource mysql {
provider = "mysql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
generator erd {
provider = "prisma-erd-generator"
output = "entity-relationship-diagram.svg"
}
model Animal {
id Int @id @default(autoincrement())
name String
animalAndBodyParts AnimalAndBodyParts[] @relation()
}
model AnimalAndBodyParts {
id Int @id @default(autoincrement())
count Int
isVital Boolean @map("is_vital")
animal Animal @relation(fields: [animalId], references: [id])
animalId Int
bodyPart BodyPart @relation(fields: [bodyPartId], references: [id])
bodyPartId Int
}
model BodyPart {
id Int @id @default(autoincrement())
name String
animalAndBodyParts AnimalAndBodyParts[] @relation()
}
它将生成一个数据库,如图所示:
您可以这样保存数据:
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
const saveData = async () => {
const animal = await prisma.animal.create({
data: {
name: 'Lion',
animalAndBodyParts: {
create: {
count: 2,
isVital: true,
bodyPart: {
create: {
name: 'Eye',
},
},
},
},
},
include: {
animalAndBodyParts: {
include: {
bodyPart: true,
},
},
},
})
console.log(JSON.stringify(animal, null, 2));
}
saveData()
数据如下图所示