通过 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,
    },
  })