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

如何无需Resolver获取SQLAlchemy关联表属性(Strawberry GraphQL)

解决方案

1. 调整数据库关联模型(以Prisma为例)

先确保关联表LabFile的关联关系定义清晰,让ORM能识别中间表属性。如果之前是让Lab直接关联File,需要改成Lab关联LabFile、再通过LabFile关联File,以此暴露中间表的file_type字段:

model Lab {
  id        Int      @id @default(autoincrement())
  name      String
  // 直接关联到中间表,而非File
  labFiles  LabFile[]
}

model File {
  id        Int      @id @default(autoincrement())
  path      String
}

model LabFile {
  id        Int      @id @default(autoincrement())
  labId     Int
  fileId    Int
  file_type String
  lab       Lab      @relation(fields: [labId], references: [id], onDelete: Cascade)
  file      File     @relation(fields: [fileId], references: [id], onDelete: Cascade)
}

2. 修改GraphQL Schema定义

把原来直接返回File列表的字段,替换成返回LabFile列表,这样就能同时获取中间表的file_type和关联的File属性:

type Lab {
  id: ID!
  name: String!
  // 替换原files字段,改为返回包含中间表数据的labFiles
  labFiles: [LabFile!]!
}

type LabFile {
  id: ID!
  file_type: String!
  // 嵌套关联File对象
  file: File!
}

type File {
  id: ID!
  path: String!
}

type Query {
  getLab(id: ID!): Lab
}

3. 查询示例

现在查询Lab时,就能通过嵌套查询同时拿到file_type和File的属性:

query GetLab($id: ID!) {
  getLab(id: $id) {
    id
    name
    labFiles {
      file_type
      file {
        id
        path
      }
    }
  }
}

其他ORM的适配思路

如果用Sequelize这类ORM,同样要调整关联方式:

  • 模型定义时用belongsToMany指定through为LabFile
  • 查询Lab时通过include嵌套加载LabFile和File

只要ORM的关联配置正确,自动生成的GraphQL层(比如Nexus、Hasura)会自动处理数据返回,不需要手写Resolver。

内容的提问来源于stack exchange,提问作者Aidos Kenessov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:22:53