作用: 用于在创建或更新记录时,将现有记录关联起来,或者在关联记录不存在时创建它。
1. 基本概念
connectOrCreate 选项允许你在关联记录不存在时创建它,并将其与当前记录关联。它接受一个数组,每个元素都是一个对象,包含 where 和 create 两个属性:
- where:用于查找现有记录的条件。如果找到匹配的记录,则将其关联。
- create:如果 where 条件没有找到匹配的记录,则使用 create 中提供的数据创建新记录,并将其关联。
2. 示例
假设你有一个 User 模型和一个 Role 模型,其中 User 可以有多个 Role,Role 也可以属于多个 User。
- 模型定义
model User {
id Int @id @default(autoincrement())
name String
email String @unique
age Int
roles Role[] @relation("UserRoles")
}
model Role {
id Int @id @default(autoincrement())
name String @unique
users User[] @relation("UserRoles")
}
3. 创建用户并连接或创建角色
const user = await prisma.user.create({
data: {
name: 'John Doe',
email: 'john.doe@example.com',
age: 25,
roles: {
connectOrCreate: [
{
where: { name: 'Admin' },
create: { name: 'Admin' },
},
{
where: { name: 'Editor' },
create: { name: 'Editor' },
},
],
},
},
});
console.log(user);
-
在这个示例中:
- 如果 Role 表中已经存在 name 为 Admin 的记录,则将其与新创建的用户关联。
- 如果 Role 表中不存在 name 为 Admin 的记录,则创建一个新的 Role 记录,并将其与新创建的用户关联。
- 同样的逻辑适用于 Editor 角色。
4. 更新用户并连接或创建角色
const user = await prisma.user.update({
where: {
id: 1,
},
data: {
roles: {
connectOrCreate: [
{
where: { name: 'Moderator' },
create: { name: 'Moderator' },
},
],
},
},
});
console.log(user);
-
在这个示例中:
- 如果 Role 表中已经存在 name 为 Moderator 的记录,则将其与用户 ID 为 1 的用户关联。
- 如果 Role 表中不存在 name 为 Moderator 的记录,则创建一个新的 Role 记录,并将其与用户 ID 为 1 的用户关联。
5. 处理唯一约束
connectOrCreate 特别适合处理具有唯一约束的字段。例如,Role 模型中的 name 字段被标记为 @unique,这意味着每个角色名称必须是唯一的。connectOrCreate 确保不会创建重复的角色记录。
6. 错误处理
如果 where 条件不唯一,connectOrCreate 会抛出错误。因此,确保 where 条件能够唯一标识记录。
- 示例:处理错误
try {
const user = await prisma.user.create({
data: {
name: 'John Doe',
email: 'john.doe@example.com',
age: 25,
roles: {
connectOrCreate: [
{
where: { name: 'Admin' },
create: { name: 'Admin' },
},
{
where: { name: 'Admin' }, // 重复的 where 条件
create: { name: 'Admin' },
},
],
},
},
});
console.log(user);
} catch (error) {
console.error('Error:', error.message);
}
在这个示例中,由于 where 条件重复,connectOrCreate 会抛出错误。