与Prisma上的Self的一对多关系



我正试图实现一个类似于Prisma的简单应用程序,用户可以向左和向右滑动来喜欢或不喜欢另一个用户,之后,我能够获取比赛和候选人。匹配对象是所有同样喜欢我的用户,而候选对象是除了我自己、我的匹配对象、我不喜欢的用户和不喜欢我的用户之外的所有用户。

我让它工作创建一个用户模型,一个喜欢模型和一个不喜欢模型

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'
}
]
}

我的问题是我不知道如何运行上面描述的更复杂的查询,匹配和候选。任何想法?

您的模式应该是这样的:

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' },
},
},
})

获取用户1喜欢的用户也很容易使用嵌套读取:

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

最新更新