通过 prisma 更新关系数据
Update relation datas via prisma
我目前正在进行一个项目并开发我的 API 我正在使用 ORM Prisma 我才刚刚开始使用它。我设法做了一个经典的 CRUD,除了我遇到了一个错误,我不明白我在更新期间没有使用 TypeORM,我向你解释。
基本上我的应用程序 table 看起来像这样:
model candidature {
id Int @id @default(autoincrement())
last_name String? @db.VarChar(255)
first_name String? @db.VarChar(255)
....
candidature_files candidature_files[]
}
我也有一个Candidature_filestable:
model candidature_files {
id Int @id @default(autoincrement())
file_id Int
is_checked Boolean @default(false)
candidature_id Int
candidature candidature @relation(fields: [candidature_id], references: [id])
candidature_files_list candidature_files_list @relation(fields: [file_id], references: [id])
@@index([file_id], name: "candidature_files_candidature_ibfk_1")
@@index([candidature_id], name: "candidature_files_candidature_ibfk_2")
}
我的问题是我希望能够与 同时更新 Candidature_files 的数据候选人,因此发送此类数据:
"last_name":"Jean-Meulaine",
...
"candidature_files": [
{
"id": 1,
"file_id": 1,
"is_checked": false,
"candidature_id": 1
},
{
"id": 2,
"file_id": 2,
"is_checked": true,
"candidature_id": 1
},
{
"id": 3,
"file_id": 3,
"is_checked": false,
"candidature_id": 1
}
]
但是当我发送这样的表格时,它returns一个错误:
Invalid `prisma.candidature.update()` invocation:
{
where: {
id: 1
},
data: {
last_name: 'Jean-Meulaine',
...
candidature_files: [
{
id: 1,
file_id: 1,
is_checked: false
},
{
id: 2,
file_id: 2,
is_checked: false
},
{
id: 3,
file_id: 3,
is_checked: false
}
]
~~~~~~~~~~~~~~~~~~~~~
},
include: {
candidature_files: true
}
}
Argument candidature_files: Got invalid value
[
{
id: 1,
file_id: 1,
is_checked: false
},
{
id: 2,
file_id: 2,
is_checked: false
},
{
id: 3,
file_id: 3,
is_checked: false
}
]
这是我的更新函数,非常基础:
public async update(req: Request, res: Response) {
const candidatureId: number = parseInt(req.params.id);
const candidature = req.body
try {
const updatedCandidature = await prisma.candidature.update({
where:{
id:candidatureId
},
data:
candidature,
include:{
candidature_files:true
}
})
res.json(updatedCandidature)
console.log(updatedCandidature);
} catch (error) {
console.log(error);
return res.status(500).json(error);
}
}
好了,我希望你有足够的信息来帮助我解决这个问题,提前谢谢你! :)
您缺少 create
。应该是这样的:
candidature_files: {
create: [
{
id: 1,
file_id: 1,
is_checked: false
},
{
id: 2,
file_id: 2,
is_checked: false
},
{
id: 3,
file_id: 3,
is_checked: false
}
]
}
您可以在此处了解有关添加关系数据的更多信息:https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#nested-writes
更新:
由于您需要更新,因此需要进行如下配置:
const candidatureId: number = parseInt(req.params.id);
const candidature = req.body
const { candidature_files, ...rest } = candidature
const updatedCandidature = await prisma.candidature.update({
where: {
id: candidatureId,
},
data: {
...rest,
candidature_files: {
update: candidature_files.map(({ id, ...data }) => ({
where: { id: id },
data,
})),
},
},
include: {
candidature_files: true,
},
})
我目前正在进行一个项目并开发我的 API 我正在使用 ORM Prisma 我才刚刚开始使用它。我设法做了一个经典的 CRUD,除了我遇到了一个错误,我不明白我在更新期间没有使用 TypeORM,我向你解释。
基本上我的应用程序 table 看起来像这样:
model candidature {
id Int @id @default(autoincrement())
last_name String? @db.VarChar(255)
first_name String? @db.VarChar(255)
....
candidature_files candidature_files[]
}
我也有一个Candidature_filestable:
model candidature_files {
id Int @id @default(autoincrement())
file_id Int
is_checked Boolean @default(false)
candidature_id Int
candidature candidature @relation(fields: [candidature_id], references: [id])
candidature_files_list candidature_files_list @relation(fields: [file_id], references: [id])
@@index([file_id], name: "candidature_files_candidature_ibfk_1")
@@index([candidature_id], name: "candidature_files_candidature_ibfk_2")
}
我的问题是我希望能够与 同时更新 Candidature_files 的数据候选人,因此发送此类数据:
"last_name":"Jean-Meulaine",
...
"candidature_files": [
{
"id": 1,
"file_id": 1,
"is_checked": false,
"candidature_id": 1
},
{
"id": 2,
"file_id": 2,
"is_checked": true,
"candidature_id": 1
},
{
"id": 3,
"file_id": 3,
"is_checked": false,
"candidature_id": 1
}
]
但是当我发送这样的表格时,它returns一个错误:
Invalid `prisma.candidature.update()` invocation:
{
where: {
id: 1
},
data: {
last_name: 'Jean-Meulaine',
...
candidature_files: [
{
id: 1,
file_id: 1,
is_checked: false
},
{
id: 2,
file_id: 2,
is_checked: false
},
{
id: 3,
file_id: 3,
is_checked: false
}
]
~~~~~~~~~~~~~~~~~~~~~
},
include: {
candidature_files: true
}
}
Argument candidature_files: Got invalid value
[
{
id: 1,
file_id: 1,
is_checked: false
},
{
id: 2,
file_id: 2,
is_checked: false
},
{
id: 3,
file_id: 3,
is_checked: false
}
]
这是我的更新函数,非常基础:
public async update(req: Request, res: Response) {
const candidatureId: number = parseInt(req.params.id);
const candidature = req.body
try {
const updatedCandidature = await prisma.candidature.update({
where:{
id:candidatureId
},
data:
candidature,
include:{
candidature_files:true
}
})
res.json(updatedCandidature)
console.log(updatedCandidature);
} catch (error) {
console.log(error);
return res.status(500).json(error);
}
}
好了,我希望你有足够的信息来帮助我解决这个问题,提前谢谢你! :)
您缺少 create
。应该是这样的:
candidature_files: {
create: [
{
id: 1,
file_id: 1,
is_checked: false
},
{
id: 2,
file_id: 2,
is_checked: false
},
{
id: 3,
file_id: 3,
is_checked: false
}
]
}
您可以在此处了解有关添加关系数据的更多信息:https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#nested-writes
更新:
由于您需要更新,因此需要进行如下配置:
const candidatureId: number = parseInt(req.params.id);
const candidature = req.body
const { candidature_files, ...rest } = candidature
const updatedCandidature = await prisma.candidature.update({
where: {
id: candidatureId,
},
data: {
...rest,
candidature_files: {
update: candidature_files.map(({ id, ...data }) => ({
where: { id: id },
data,
})),
},
},
include: {
candidature_files: true,
},
})