使用 prisma 创建 1:n 关系的对象

dcs*_*san 5 orm typescript prisma

我有两个模型,Fish 和 BoardFish\n具有 1:1 关系 - BoardFish 是 Fish 的一种类型\n我创建了一些具有命名类型的种子 Fish。

\n

我怎样才能在 Prisma 中做到这一点?我认为我已经有了模式设置,但是除了花哨/嵌套类型之外,插入数据并没有真正记录下来。

\n

架构:

\n
model Fish {\n    name      String      @id\n    boardFish BoardFish[]\n}\n\nmodel BoardFish {\n    id       Int    @id @default(autoincrement())\n    name     String\n    fishType Fish   @relation(fields: [name], references: [name])\n}\n
Run Code Online (Sandbox Code Playgroud)\n

尝试创建:

\n
        let fishes = []\n        for (let c = 0; c < fishCount; c++) {\n            const fishType = await prisma.fish.findFirst({ where: { name: 'salmon' } })\n            const fishData = {\n                fishType: fishType!.name,\n                // name: 'salmon',\n                px: 0,\n                py: 0,\n            }\n            const fish = await prisma.boardFish.create({ data: fishData })\n            fishes.push(fish)\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

但我无法进行插入:

\n
\xe2\x86\x92 35 const fish = await prisma.boardFish.create({\n       data: {\n         fishType: 'salmon',\n                   ~~~~~~~~\n         px: 3,\n         py: 5\n       }\n     })\n\nArgument fishType: Got invalid value 'salmon' on prisma.createOneBoardFish. Provided String, expected FishCreateNestedOneWithoutBoardFishInput:\ntype FishCreateNestedOneWithoutBoardFishInput {\n  create?: FishCreateWithoutBoardFishInput | FishUncheckedCreateWithoutBoardFishInput\n  connectOrCreate?: FishCreateOrConnectWithoutBoardFishInput\n  connect?: FishWhereUniqueInput\n}\n
Run Code Online (Sandbox Code Playgroud)\n

所涉及的类型很难理解,Prisma 似乎真的很擅长用数千行自动生成的代码来实现大多数“魔法”,我一直在挖掘这些代码,但运气不佳。

\n

小智 5

如果你想要有 1:1 的关系,我认为模式需要看起来更像这样:

model Fish {
    name      String      @id
    boardFish BoardFish? // removed autogenerated `[]` and made optional
}

model BoardFish {
    id       Int    @id @default(autoincrement())
    name     String
    fishType Fish   @relation(fields: [name], references: [name])
}
Run Code Online (Sandbox Code Playgroud)

创建相关记录时,使用 prisma 的connect api

model Fish {
    name      String      @id
    boardFish BoardFish? // removed autogenerated `[]` and made optional
}

model BoardFish {
    id       Int    @id @default(autoincrement())
    name     String
    fishType Fish   @relation(fields: [name], references: [name])
}
Run Code Online (Sandbox Code Playgroud)