我正试图实现一个类似于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 }
})