Prisma 中的嵌套写入

Kay*_*ote 4 javascript database prisma prisma2

我的架构如下所示:

model User {
  id             Int       @default(autoincrement()) @id
  createdAt      DateTime  @default(now())
  email          String    @unique
  role           String    @default("user")
  sessions       Session[]
  profile        Profile?
  goalBoard      GoalBoard[]
  team           Team[]
  ...
}

model GoalBoard {
  id          Int         @default(autoincrement()) @id
  active      Boolean    // Whether an active goalBoard
  owner       User        @relation(fields: [ownerId], references: [id])
  ownerId     Int
  createdAt   DateTime    @default(now())
  goal        Goal[]
  ...
}

model Goal {
  id               Int         @default(autoincrement()) @id
  status           String
  createdAt        DateTime    @default(now())
  owner            User        @relation(fields: [ownerId], references: [id])
  ownerId          Int
  goalBoard        GoalBoard   @relation(fields: [goalBoardId], references: [id])
  goalBoardId      Int
  content          String
  goalFrequency    GoalFrequency[]
  task             Task[]
}

model Task {
  id          Int         @default(autoincrement()) @id
  status      String     // incomplete, complete
  createdAt   DateTime    @default(now())
  content     String
  goal        Goal        @relation(fields: [goalId], references: [id])
  goalId      Int
}
Run Code Online (Sandbox Code Playgroud)

我正在编写一个采用goal对象数组的突变函数。这些goal对象具有嵌套的对象数组task。它看起来像这样:

const goals = [
  {
    title: 'string',
    ...
    tasks: [
      {
        deadline: "2020/10/10",
        ...
      }
    ]
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

我如何使用 Prisma2 处理这样的结构?需要多次写入和connectOrCreate逻辑。

这是我在数据库中写入插入的失败尝试。只需一次插入和连接即可进行测试。

  const returnGoals = await db.goal.create({
    data: {
      content: "test goal",
      owner: {
        connect: {
          id: ctx.session!.userId,
        },
      },
      goalBoard: {
        create: { // warns that create is incorrectly used here
          active: true,
          owner: {
            connect: {
              id: ctx.session!.userId,
            },
          },
        },
      },
    },
  });
Run Code Online (Sandbox Code Playgroud)

Ahm*_*ywa 6

此示例中的架构在使用此创建时没有问题

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  prisma.$connect();
  const user = await prisma.user.create({
    data: {
      email: 'a@ahmedelywa.com',
    },
  });
  const result = await prisma.goal.create({
    data: {
      content: 'test content',
      status: 'any',
      owner: {
        connect: {
          id: user.id,
        },
      },
      goalBoard: {
        create: {
          active: true,
          owner: {
            connect: {
              id: user.id,
            },
          },
        },
      },
    },
    include: {
      owner: true,
      goalBoard: true,
    },
  });

  console.log(result);
}

main();
Run Code Online (Sandbox Code Playgroud)

结果

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  prisma.$connect();
  const user = await prisma.user.create({
    data: {
      email: 'a@ahmedelywa.com',
    },
  });
  const result = await prisma.goal.create({
    data: {
      content: 'test content',
      status: 'any',
      owner: {
        connect: {
          id: user.id,
        },
      },
      goalBoard: {
        create: {
          active: true,
          owner: {
            connect: {
              id: user.id,
            },
          },
        },
      },
    },
    include: {
      owner: true,
      goalBoard: true,
    },
  });

  console.log(result);
}

main();
Run Code Online (Sandbox Code Playgroud)

也许您的隐藏架构内容的其余部分有问题