如何检测Prisma中UserProfile与Post的关联是否存在以判断用户是否点赞帖子
检测点赞关联的三种实现方案
你当前的UserProfile和Post通过likedPosts/likedBy建立了Prisma隐式多对多关联,判断是否点赞本质是检测关联是否存在,以下是常用方案,按性能优先级排序:
方案1:直接计数检测(性能最优,推荐)
用count配合some运算符直接判断是否存在符合条件的关联,不需要返回实体数据,查询效率最高:// 入参:用户ID userId,目标帖子ID postId const hasLiked = await prisma.userProfile.count({ where: { id: userId, likedPosts: { some: { id: postId } } } }) > 0返回
true则表示用户已点赞,false未点赞。也可以反过来从Post侧查询,逻辑一致:const hasLiked = await prisma.post.count({ where: { id: postId, likedBy: { some: { id: userId } } } }) > 0方案2:查询实体时附带检测(适合已需要查询用户/帖子信息的场景)
如果你刚好需要查询用户或者帖子的基础信息,可以在查询时附带过滤关联表,不需要额外发起请求:// 示例:查询帖子详情时同步判断当前用户是否点赞 const post = await prisma.post.findUnique({ where: { id: postId }, include: { likedBy: { where: { id: userId }, take: 1 // 只取1条匹配记录,避免加载全量点赞数据影响性能 } // 其他你需要返回的关联字段 } }) const hasLiked = post.likedBy.length > 0方案3:批量查询多帖子点赞状态(适合帖子列表场景)
当需要给帖子列表的每个条目标记当前用户是否点赞时,直接在列表查询中增加关联过滤即可:const posts = await prisma.post.findMany({ select: { id: true, content: true, author: true, // 其他列表需要展示的字段 likedBy: { where: { id: currentLoginUserId }, take: 1 } } }) // 遍历列表即可得到每个帖子的点赞状态 const postsWithLikeState = posts.map(post => ({ ...post, hasLiked: post.likedBy.length > 0 }))
注意:不要直接查询全量
likedPosts/likedBy再判断ID是否存在,点赞量高的场景下会加载大量无用数据,严重影响性能,优先用some运算符做存在性检测。
内容的提问来源于stack exchange,提问作者TheHackerCoding
相关产品推荐
相关产品推荐

