【问题标题】:One to many relationships with Self on PrismaPrisma 上与 Self 的一对多关系
【发布时间】:2021-10-28 01:03:41
【问题描述】:

我正在尝试使用 Prisma 实现一个类似于 tinder 的简单应用程序,用户可以左右滑动来喜欢或不喜欢另一个用户,之后,我就能够获取匹配项和候选人。匹配的都是喜欢我的用户,候选的都是除了我自己、我的匹配、我不喜欢的用户和不喜欢我的用途之外的所有用户。

我让它创建了一个用户模型、一个喜欢模型和一个不喜欢模型

model User {
  id            String     @id
  username      String     @default(value: "")
  age           Int        @default(value: 0)
  bio           String     @default(value: "") @db.VarChar(1000)
}

model Likes {
  id          Int    @id @default(autoincrement())
  userId      String
  likedUserId String
}

model Dislikes {
  id             Int    @id @default(autoincrement())
  userId         String
  dislikedUserId String
}

并创建几个相当复杂的 SQL 语句并使用 queryRaw 运行它们

它确实有效,但我觉得我没有正确使用 Prisma,我只是将 SQL 转换为 Prisma。所以我决定改变我的模型如下

model User {
  id            String     @id
  username      String     @default(value: "")
  age           Int        @default(value: 0)
  bio           String     @default(value: "") @db.VarChar(1000)
  liked         User[]     @relation("LikedUserToUser")
  disliked      User[]     @relation("DislikedUserToUser")
}

我的 IDE 提示我添加相反的关系或运行 prisma format 这样做之后,我最终得到了这样的结果

model User {
  id           String     @id
  username     String     @default(value: "")
  age          Int        @default(value: 0)
  bio          String     @default(value: "") @db.VarChar(1000)
  liked        User[]     @relation("LikedUserToUser")
  disliked     User[]     @relation("DislikedUserToUser")
  userToLike    User?      @relation("LikedUserToUser", fields: [userId], references: [id])
  userToDislike User?      @relation("DislikedUserToUser", fields: [userId], references: [id])
  userId       String?
}

现在,它似乎工作得很好,我可以“喜欢”一个用户

const user = await prisma.user.update({
    where: { id: '1' },
    data: {
      liked: {
        connect: { id: '2' },
      },
    },
  })

当我查询用户“1”时,包括我得到的喜欢

{
  id: '1',
  username: 'Cheryl',
  age: 36,
  bio: 'ornare, libero at auctor ullamcorper',
  userId: null,
  liked: [
    {
      id: '2',
      username: 'Daphne',
      age: 57,
      bio: 'at sem molestie sodales',
      userId: '1'
    }
  ]
}

我的问题是我不知道如何运行上述更复杂的查询、匹配项和候选人。有什么想法吗?

【问题讨论】:

    标签: mysql typescript prisma prisma2


    【解决方案1】:

    你的架构应该是这样的:

    model User {
      id             String  @id
      username       String  @default(value: "")
      age            Int     @default(value: 0)
      bio            String  @default(value: "")
      liked          User[]  @relation("likedUsers")
      disliked       User[]  @relation("dislikedUsers")
      likedUser      User?   @relation("likedUsers", fields: [likedUserId], references: [id])
      likedUserId    String?
      dislikedUser   User?   @relation("dislikedUsers", fields: [dislikedUserId], references: [id])
      dislikedUserId String? @map("userId")
    }
    

    然后您可以运行这样的查询(用户 1 喜欢用户 2):

    const user = await prisma.user.update({
        where: { id: '1' },
        data: {
          liked: {
            connect: { id: '2' },
          },
        },
    })
    

    使用nested reads 也可以轻松获取用户 1 喜欢的用户:

    const user = await prisma.user.findUnique({
        where: { id: '1' },
        include: { liked: true }
    })
    

    【讨论】:

    • 这正是我试图做的,但我得到了Error validating field 'liked' in model 'User': The relation field 'liked' on Model 'User' is missing an opposite relation field on the model 'User'. Either run 'prisma format' or add it manually. 的查询与我的完全一样并且完美地工作
    • 这很好用。 @relation 中的名称应该相同,然后您就不会收到此错误。
    • 这样做错误消失了,但行为很奇怪:如果我为 user1 运行上面的查询来喜欢 use2,则用户 2 被添加到用户 1 的喜欢中,但用户 1 也被添加到用户 2不喜欢!
    • 在这种情况下,您需要为喜欢和不喜欢添加单独的关系。在我的答案中编辑架构。查询将保持不变。
    猜你喜欢
    • 2021-06-30
    • 2021-10-10
    • 2021-10-03
    • 2021-07-23
    • 2022-12-31
    • 2021-03-17
    • 2022-11-25
    • 2021-12-04
    • 2023-01-27
    相关资源
    最近更新 更多