如何用Prisma查找玩家ID完全匹配的Conversation记录?
解决方案
要找到恰好包含指定玩家ID集合的对话,需同时满足两个核心条件:对话包含所有指定玩家,且对话的玩家数量与给定ID数组的长度完全一致。以下是实现代码:
const listOfIds = ["player-uuid-1", "player-uuid-2"]; // 你的目标玩家ID数组 const playerCount = listOfIds.length; // 查询完全匹配的对话 const matchingConversation = await prisma.conversation.findFirst({ where: { // 确保对话中所有玩家的ID都在目标列表内(无额外玩家) players: { every: { id: { in: listOfIds } } }, // 确保对话的玩家数量与目标数量一致 players: { count: playerCount } }, include: { players: true } // 按需包含玩家信息 }); if (matchingConversation) { // 复用已有对话 console.log("找到匹配对话,ID:", matchingConversation.id); } else { // 创建新对话 const newConversation = await prisma.conversation.create({ data: { players: { connect: listOfIds.map(id => ({ id })) } } }); console.log("创建新对话,ID:", newConversation.id); }
关键逻辑说明
players.every:约束对话中的每一个玩家ID都属于目标列表,彻底排除包含额外玩家的对话。players.count:确保对话的玩家数量和目标ID数组长度一致,结合every条件就能精准筛选出恰好包含所有指定玩家的对话。- 使用
findFirst而非findMany,因为我们只需要唯一的匹配结果(如果存在)。
内容的提问来源于stack exchange,提问作者Benjamin Groves
相关产品推荐
相关产品推荐

