Как найти отношение M к N в призме?

Сейчас работаю над проектом с 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);

и используйте обещание.all, чтобы получить имя исполнителя для каждого трека. Есть ли способ сделать это один раз по одному запросу? Я почти уверен, что есть более лучший способ сделать это. Заранее спасибо.


person lcpnine    schedule 08.12.2020    source источник


Ответы (1)


Согласно вашей схеме include не будет содержать отношения Artist. Его нужно будет включить из отношения Artists_Tracks следующим образом:

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

Таким образом, вы можете получить Artist за каждый присутствующий трек.

person Ryan    schedule 08.12.2020
comment
Я пробовал это, но у меня есть ошибки: / Я подумал, есть ли какой-то особый способ сделать в обратном порядке. include позволяет нам подключаться от многих к одному, но не от одного ко многим, не так ли? - person lcpnine; 08.12.2020
comment
Какую ошибку вы получаете? - person Ryan; 08.12.2020
comment
Я решил проблему, как вы сказали: / это произошло потому, что один из моих товарищей по команде изменил DBschema и не сообщил нам об этом. Работает отлично. Большое спасибо. - person lcpnine; 08.12.2020