在 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
                        },
                    },
                },
            },
        },
    });

这将处理所有情况,无论 userid = user.id 目前是否:

  • 是其他组织的成员并且默认拥有另一个成员资格
  • 是其他组织的成员,但没有默认成员资格
  • 不是任何组织的成员并且没有默认成员资格