You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改sample.tsx的Prisma查询以获取好友ID与名称?

如何修改Prisma查询以获取好友的ID和名称?

现有Schema定义

model User {
  id         Int           @id @default(autoincrement())
  name       String        // Not Null
  self       Friend[]      @relation("self")   
  friend     Friend[]      @relation("friend")  
}

model Friend {
  id         Int        @id @default(autoincrement())
  user       User       @relation("self", fields: [userId], references: [id])
  userId     Int        // Foreign Key
  friend     User       @relation("friend", fields: [friendId], references: [id])
  friendId   Int        // Foreign Key
  // @@unique([userId, friendID]) 
}

当前查询代码及结果

查询代码

const friends = await prisma.user.findUnique({
  where: {
    id: userId, // user ID
  },
  select: {
    name: true, // user name
    // Friend Table
    friend: {
      select: {
        userId: true, // friends' ID
      },
    },
  },
});

console.log(friends); 

查询结果

{  
  name: 'Paul McCartney',
  friend: [ { userId: 1 }, { userId: 3 }, { userId: 4 } ]
}

期望结果

希望获取当前用户名称的同时,拿到每个好友的ID和名称,两种形式均可:

{  
  name: 'Paul McCartney',
  friend: [ { userId: 1 , name: "John Lennon"}, { userId: 3, name: "Ringo starr" }, { userId: 4, name: "George Harrison" } ]
}

或者:

{  
  name: 'Paul McCartney',
  friendsList: {
    friendIds: [1, 3, 4],
    names: ["John Lennon", "Ringo starr", "George Harrison"]
  }
}

修改方案

方案1:直接查询关联的好友用户信息(对应第一种期望结果)

修改查询代码,在friend的select中嵌套查询关联的好友用户记录,获取ID和名称后调整输出结构:

const friends = await prisma.user.findUnique({
  where: {
    id: userId,
  },
  select: {
    name: true,
    friend: {
      select: {
        // 从关联的friend用户中获取ID和名称
        friend: {
          select: {
            id: true,
            name: true,
          },
        },
      },
    },
  },
});

// 转换为期望的格式
const formattedResult = {
  name: friends?.name,
  friend: friends?.friend.map(item => ({
    userId: item.friend.id,
    name: item.friend.name,
  })) || [],
};

console.log(formattedResult);

方案2:查询后转换为第二种期望格式

先按方案1的方式获取完整数据,再对结果进行数组拆分:

const friends = await prisma.user.findUnique({
  where: {
    id: userId,
  },
  select: {
    name: true,
    friend: {
      select: {
        friend: {
          select: {
            id: true,
            name: true,
          },
        },
      },
    },
  },
});

// 转换为第二种格式
const formattedResult = {
  name: friends?.name,
  friendsList: {
    friendIds: friends?.friend.map(item => item.friend.id) || [],
    names: friends?.friend.map(item => item.friend.name) || [],
  },
};

console.log(formattedResult);

说明

你的Schema中,Friend模型的friend字段关联的是好友的User记录,通过嵌套select: { friend: { select: { id: true, name: true } } }就能拿到好友的完整信息,再根据需求调整输出结构即可。


内容的提问来源于stack exchange,提问作者K-Yuuma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:45:18