在 Prisma 中执行此关系 "transaction" 的更好方法
Better way to perform this Relation "transaction" in Prisma
我昨天发布了一个问题,其中包含可以找到的相关 prisma 模式 。
作为后续问题,当成员创建新的 Organization
时,我希望它成为他们选择的 Membership
。我发现这样做的唯一方法是取消选择他们当前的 Memebership
(将其设置为 null
),执行 create
,然后在 create
时恢复关系没用。如果没有 selectedMembership
,我必须使用 updateMany
进行初始操作。是吗?
//Deselect the currently selected Org
const updatedMembership = await prisma.membership.updateMany({
where: {
selectedById: user.id
},
data: {
selectedById: null
}
});
if (updatedMembership) {
//Select the new one.
const result = await prisma.organization.create({
data: {
name: body.name,
members: {
create: [{
role: MemberRole.OWNER,
userId: user.id,
selectedById: user.id
}]
}
},
});
if (result) {
res.status(200)
.json(result);
} else {
//Restore the previously selected one if the create failed
if(user.selectedMembership) {
await prisma.membership.update({
where: {
id: user.selectedMembership?.id
},
data: {
selectedById: user.id
}
});
}
res.status(500).end();
}
}
您可以使用 connect
API 在单个查询中完成所有这些操作。只需确保 user.id
有效即可。
这是您问题中创建和更新查询逻辑的更简洁版本:
const result = await prisma.organization.create({
data: {
name: body.name,
members: {
create: {
role: MemberRole.OWNER,
user: {
connect: {
id: user.id, // making the user a member of the organization
},
},
selectedBy: {
connect: {
id: user.id, // selecting the newly created membership as the user's default organization
},
},
},
},
},
});
这将处理所有情况,无论 user
和 id = user.id
目前是否:
- 是其他组织的成员并且默认拥有另一个成员资格
- 是其他组织的成员,但没有默认成员资格
- 不是任何组织的成员并且没有默认成员资格
我昨天发布了一个问题,其中包含可以找到的相关 prisma 模式
作为后续问题,当成员创建新的 Organization
时,我希望它成为他们选择的 Membership
。我发现这样做的唯一方法是取消选择他们当前的 Memebership
(将其设置为 null
),执行 create
,然后在 create
时恢复关系没用。如果没有 selectedMembership
,我必须使用 updateMany
进行初始操作。是吗?
//Deselect the currently selected Org
const updatedMembership = await prisma.membership.updateMany({
where: {
selectedById: user.id
},
data: {
selectedById: null
}
});
if (updatedMembership) {
//Select the new one.
const result = await prisma.organization.create({
data: {
name: body.name,
members: {
create: [{
role: MemberRole.OWNER,
userId: user.id,
selectedById: user.id
}]
}
},
});
if (result) {
res.status(200)
.json(result);
} else {
//Restore the previously selected one if the create failed
if(user.selectedMembership) {
await prisma.membership.update({
where: {
id: user.selectedMembership?.id
},
data: {
selectedById: user.id
}
});
}
res.status(500).end();
}
}
您可以使用 connect
API 在单个查询中完成所有这些操作。只需确保 user.id
有效即可。
这是您问题中创建和更新查询逻辑的更简洁版本:
const result = await prisma.organization.create({
data: {
name: body.name,
members: {
create: {
role: MemberRole.OWNER,
user: {
connect: {
id: user.id, // making the user a member of the organization
},
},
selectedBy: {
connect: {
id: user.id, // selecting the newly created membership as the user's default organization
},
},
},
},
},
});
这将处理所有情况,无论 user
和 id = user.id
目前是否:
- 是其他组织的成员并且默认拥有另一个成员资格
- 是其他组织的成员,但没有默认成员资格
- 不是任何组织的成员并且没有默认成员资格