Prisma ORM 第四章 表之间关系的建立和删除-2. connectOrCreate

作用: 用于在创建或更新记录时,将现有记录关联起来,或者在关联记录不存在时创建它。

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 会抛出错误。

上一篇:pushgateway的快速使用教程(附Java版通用推送代码)


下一篇:深度学习,Top算法,2024年末总结