如何删除prisma中所有相关记录的记录
How to delete a record with all relevant records in prisma
我知道 the documentation of prisma-client 中有一些部分与我的问题相关:
但是,我无法理解如何在 (JavaScript) prisma-client 中删除一条记录及其所有相关记录。
比如我的datamodel是这样的:
type Board {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "BoardOwnershipRelation")
title: String!
description: String
taskGroups: [TaskGroup!]!
}
type TaskGroup {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskGroupOwnershipRelation")
board: Board!
title: String!
description: String
precedence: Int
tasks: [Task!]!
}
type Task {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskOwnershipRelation")
taskGroup: TaskGroup!
title: String!
description: String
dueDate: DateTime
precedence: Int
items: [TaskItem!]!
assignedTo: [User!]! @relation(name: "AssignmentRelation")
}
type TaskItem {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskItemOwnershipRelation")
task: Task!
title: String!
description: String
checked: Boolean!
precedence: Int
}
如何 我可以删除一个板及其所有相关的任务组、任务和任务项吗?!
编辑:
我最近尝试了这个解决方案,效果也很好。
// e.g. this is in my GraphQL resolvers async function...
await prisma.deleteManyTaskItems({
task: {
taskGroup: {
board: {
id: boardId
}
}
}
});
await prisma.deleteManyTasks({
taskGroup: {
board: {
id: boardId
}
}
});
await prisma.deleteManyTaskGroups({
board: {
id: boardId
}
});
return await prisma.deleteBoard({ id: boardId });
但是,我的问题有更好的解决方案吗???
您可以使用@relation 指令的 "onDelete" 参数指定删除实体时发生的情况 (documentation)
您只需像这样更改您的数据模型:
type Board {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "BoardOwnershipRelation")
title: String!
description: String
taskGroups: [TaskGroup!]! @relation(name: "BoardTaskGroups" onDelete: CASCADE)
}
type TaskGroup {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskGroupOwnershipRelation")
board: Board! @relation(name: "BoardTaskGroups")
title: String!
description: String
precedence: Int
tasks: [Task!]! @relation(name: "TaskGroupsTask" onDelete: CASCADE)
}
type Task {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskOwnershipRelation")
taskGroup: TaskGroup! @relation(name: "TaskGroupsTask")
title: String!
description: String
dueDate: DateTime
precedence: Int
items: [TaskItem!]! @relation(name: "TaskTaskItem" onDelete: CASCADE)
assignedTo: [User!]! @relation(name: "AssignmentRelation")
}
type TaskItem {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskItemOwnershipRelation")
task: Task! @relation(name: "TaskTaskItem")
title: String!
description: String
checked: Boolean!
precedence: Int
}
然后删除你的看板。所有其他删除将由 Prisma
完成
我知道 the documentation of prisma-client 中有一些部分与我的问题相关:
但是,我无法理解如何在 (JavaScript) prisma-client 中删除一条记录及其所有相关记录。
比如我的datamodel是这样的:
type Board {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "BoardOwnershipRelation")
title: String!
description: String
taskGroups: [TaskGroup!]!
}
type TaskGroup {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskGroupOwnershipRelation")
board: Board!
title: String!
description: String
precedence: Int
tasks: [Task!]!
}
type Task {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskOwnershipRelation")
taskGroup: TaskGroup!
title: String!
description: String
dueDate: DateTime
precedence: Int
items: [TaskItem!]!
assignedTo: [User!]! @relation(name: "AssignmentRelation")
}
type TaskItem {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskItemOwnershipRelation")
task: Task!
title: String!
description: String
checked: Boolean!
precedence: Int
}
如何 我可以删除一个板及其所有相关的任务组、任务和任务项吗?!
编辑:
我最近尝试了这个解决方案,效果也很好。
// e.g. this is in my GraphQL resolvers async function...
await prisma.deleteManyTaskItems({
task: {
taskGroup: {
board: {
id: boardId
}
}
}
});
await prisma.deleteManyTasks({
taskGroup: {
board: {
id: boardId
}
}
});
await prisma.deleteManyTaskGroups({
board: {
id: boardId
}
});
return await prisma.deleteBoard({ id: boardId });
但是,我的问题有更好的解决方案吗???
您可以使用@relation 指令的 "onDelete" 参数指定删除实体时发生的情况 (documentation)
您只需像这样更改您的数据模型:
type Board {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "BoardOwnershipRelation")
title: String!
description: String
taskGroups: [TaskGroup!]! @relation(name: "BoardTaskGroups" onDelete: CASCADE)
}
type TaskGroup {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskGroupOwnershipRelation")
board: Board! @relation(name: "BoardTaskGroups")
title: String!
description: String
precedence: Int
tasks: [Task!]! @relation(name: "TaskGroupsTask" onDelete: CASCADE)
}
type Task {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskOwnershipRelation")
taskGroup: TaskGroup! @relation(name: "TaskGroupsTask")
title: String!
description: String
dueDate: DateTime
precedence: Int
items: [TaskItem!]! @relation(name: "TaskTaskItem" onDelete: CASCADE)
assignedTo: [User!]! @relation(name: "AssignmentRelation")
}
type TaskItem {
id: ID! @unique
createdAt: DateTime!
updatedAt: DateTime!
owner: User! @relation(name: "TaskItemOwnershipRelation")
task: Task! @relation(name: "TaskTaskItem")
title: String!
description: String
checked: Boolean!
precedence: Int
}
然后删除你的看板。所有其他删除将由 Prisma
完成