Warm tip: This article is reproduced from serverfault.com, please click

orm-如何在棱镜中搜索M与N的关系?

(orm - How to search M to N relationship in prisma?)

发布于 2020-12-08 12:30:18

如今,我正在与prisma进行项目合作。我设计了m对n关系表。下面是我的代码。schema.prisma

model Artists {
  id                 Int                  @id @default(autoincrement())
  artistName         String?
  Albums             Albums[]
  Artists_Tracks     Artists_Tracks[]
}

model Artists_Tracks {
  id       Int      @id @default(autoincrement())
  trackId  Int?
  artistId Int?
  Artists  Artists? @relation(fields: [artistId], references: [id])
  Tracks   Tracks?  @relation(fields: [trackId], references: [id])

  @@index([artistId], name: "Artists_Tracks_artistId_foreign_idx")
  @@index([trackId], name: "Artists_Tracks_trackId_foreign_idx")
}

model Tracks {
  id                Int                 @id @default(autoincrement())
  trackName         String?
  albumTrackNumber  Int?
  albumId           Int?
  Albums            Albums?             @relation(fields: [albumId], references: [id])
  Artists_Tracks    Artists_Tracks[]

  @@index([albumId], name: "Tracks_albumId_foreign_idx")
}

这是我的棱镜代码。我想要做的是按曲目名称搜索,并获取所有带有艺术家姓名的曲目信息。

+ edit)我尝试过的是

// first try
optObj.include = {
    Albums: {
      select: { cover: true },
    },
    Artists_Tracks: {
       Albums: true
    },
 };

// second try
optObj.include = {
    Albums: {
      select: { cover: true },
    },
    Artists_Tracks: true,
    Artists: true,
  };


  const result = await prisma.tracks.findMany(optObj);

并使用promise.all获取每首曲目的艺术家姓名。有什么办法可以一次查询一次吗?我敢肯定会有更好的方法来做到这一点。先感谢你。

Questioner
YuTaek
Viewed
0
Ryan 2020-12-08 20:51:51

根据你的架构,include不会包含该Artist关系。必须将其包含在Artists_Tracks像这样关系中:

const result = await prisma.tracks.findMany({
    include: {
      Albums: {
        select: { cover: true },
      },
      Artists_Tracks: { include: { Artists: true } },
    },
})

这样,你就可以获取当前Artist的每个曲目。