使用 Prisma 的嵌套创建查询返回未定义

Posted

技术标签:

【中文标题】使用 Prisma 的嵌套创建查询返回未定义【英文标题】:Nested create query using Prisma returns undefined 【发布时间】:2021-12-21 22:06:24 【问题描述】:

我正在开发一个使用 Graphql Prisma 和 Postgres 作为后端的锻炼应用程序。 到目前为止,我的棱镜架构如下:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client 
  provider = "prisma-client-js"


datasource db 
  provider = "postgresql"
  url      = env("DATABASE_URL")


model Exercise 
  id        Int      @id @default(autoincrement())
  name      String
  numSets   Int
  holdTime  Int?
  owner     Workout? @relation(fields: [workoutId], references: [id])
  workoutId Int?


model Workout 
  id        Int        @id @default(autoincrement())
  createdAt DateTime   @default(now())
  updatedAt DateTime   @updatedAt
  category  String   
  exercises Exercise[]

该模式定义了一个 Workout 对象,该对象接受一个类别和一个练习列表。我正在尝试使用 Prisma 的嵌套创建查询创建包含对象列表的锻炼,但是未创建锻炼列表。我无法判断我的架构或脚本是否有问题。

我用来测试创建的脚本是:

const  PrismaClient  = require("@prisma/client")

const prisma = new PrismaClient()

async function main() 
    const newWorkout = await prisma.workout.create(
        data: 
            category: 'Push',
            exercises: 
              create: [
                
                  name: "pushup",
                  numSets: 5
                ,
                
                  name: "headstand",
                  numSets: 3,
                  holdTime: 30
                
              ]
            
        
    )
    console.log(newWorkout)

    const workout = await prisma.workout.findUnique(
      where: 
        id: 1
      
    )
    console.log(workout.exercises)


main()
    .catch(e => 
        throw e
    )
    .finally(async () => 
        await prisma.$disconnect()
    )

打印语句的输出:

console.log(newWorkout): " 编号:1, 创建于:2021-11-09T07:03:40.844Z, 更新时间:2021-11-09T07:03:40.848Z, 类别:“推” "

console.log(workout.exercises): “未定义”

【问题讨论】:

【参考方案1】:

Prisma 默认不获取 relation 字段。因此,exercises 字段不会与workout 记录一起返回。这适用于所有查询,包括 createfind

要获取exercises 字段,您应该使用includeselect。如果要返回关系中的所有字段,则首选include,而select 可让您指定要返回的确切字段。

这是返回 excercises 字段的代码的更新版本:

const newWorkout = await prisma.workout.create(
        data: 
            category: 'Push',
            exercises: 
              create: [
                
                  name: "pushup",
                  numSets: 5
                ,
                
                  name: "headstand",
                  numSets: 3,
                  holdTime: 30
                
              ]
            
        ,
        include: 
            exercises: true
        
    )

    console.log(newWorkout) 

    let workout = await prisma.workout.findUnique(
      where: 
        id: 1
      ,
      include: 
          exercises: true
      
    )
    console.log(workout.exercises) 

【讨论】:

感谢您使用包含的作品,这正是我所需要的! 太棒了!乐于助人:)

以上是关于使用 Prisma 的嵌套创建查询返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL(Prisma)突变数据未定义

猫鼬嵌套文档返回未定义

Prisma:字段...未在...输入类型或类型中定义...预期但未提交对象

无法运行 prisma deploy:错误:未定义的集群不存在

具有嵌套 connectOrCreate 的 Prisma 多个创建查询抛出唯一约束失败

返回的对象未定义,使用 dynamicHelpers