【问题标题】:Update relation datas via prisma通过 prisma 更新关系数据
【发布时间】:2021-09-06 03:18:21
【问题描述】:

我目前正在进行一个项目并开发我的 API,我正在使用 ORM Prisma,我刚刚开始使用它。我设法做了一个经典的 CRUD,除了我遇到了一个我不明白的错误,我在更新期间没有使用 TypeORM,我向你解释。

基本上我有一个如下所示的应用程序表:

model candidature {
  id                                  Int                                   @id @default(autoincrement())
  last_name                           String?                               @db.VarChar(255)
  first_name                          String?                               @db.VarChar(255)
....
  candidature_files                   candidature_files[]
}

我还有一个 Candidature_files 表:

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 的数据和 Candidature 的数据,因此发送这种数据:

"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
            }
        ]

但是当我发送这样的表单时,它会返回一个错误:

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
  }
]

这是我的 update 功能,非常基本:

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);
    }
}

你去吧,我希望你有足够的信息来帮助我解决这个问题,提前谢谢你! :)

【问题讨论】:

    标签: node.js typescript relationship updates prisma


    【解决方案1】:

    您缺少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,
        },
      })
    

    【讨论】:

    • 感谢@Ryan 的评论,但我的问题是在更新期间而不是在创建期间。我的目标是提交一个表格,其中包含有关候选人姓名、电子邮件等所有信息的表格...如果例如 file_id = 2 被修改,请更新它...在示例中我找不到情况这是非常流行的......
    猜你喜欢
    • 2021-07-23
    • 2022-11-24
    • 2019-03-25
    • 2021-12-04
    • 2021-04-11
    • 1970-01-01
    • 2022-01-11
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多