如何在棱镜中搜索 M 到 N 的关系?

Posted

技术标签:

【中文标题】如何在棱镜中搜索 M 到 N 的关系?【英文标题】:How to search M to N relationship in prisma? 【发布时间】:2021-03-19 18:38:03 【问题描述】:

我现在正在使用 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")

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

+编辑) 我试过的是

// 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 获取每首曲目的艺术家姓名。有没有办法通过一个查询一次做到这一点?我很确定会有更好的方法来做到这一点。提前谢谢你。

【问题讨论】:

【参考方案1】:

根据您的架构,include 将不包含Artist 关系。它必须包含在Artists_Tracks 关系中,如下所示:

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

通过这种方式,您可以获得每个当前曲目的Artist

【讨论】:

我试过这个但我得到了错误:/所以我想有什么特殊的方法可以反过来做。 include 允许我们连接多对一,但不是一对多,不是吗? 我按照你的说法解决了这个问题:/ 这是因为我的一位队友更改了 DBschema 并且没有让我们知道它。它工作完美。非常感谢。

以上是关于如何在棱镜中搜索 M 到 N 的关系?的主要内容,如果未能解决你的问题,请参考以下文章

两个棱镜模型之间的一对多和可能对多关系

如何在 MVVM 模式中从页面导航到 WPF 中的页面?没有棱镜的概念[重复]

如何在具有棱镜的Xamarin表单中为contentview创建单独的视图模型?

如何在模块化应用程序中使用棱镜范围的 RegionManager?

如何在 GraphQL 中使用变异方法在模型中创建关系?

你如何处理数据库关系模式中的递归关系N:M