【问题标题】:Nested create query using Prisma returns undefined使用 Prisma 的嵌套创建查询返回未定义
【发布时间】: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): “未定义”

【问题讨论】:

    标签: postgresql prisma prisma-graphql


    【解决方案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) 
    
    

    【讨论】:

    • 感谢您使用包含的作品,这正是我所需要的!
    • 太棒了!乐于助人:)
    猜你喜欢
    • 2019-06-18
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2016-09-18
    • 2013-07-12
    • 2019-11-30
    相关资源
    最近更新 更多