如何无需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
相关产品推荐
相关产品推荐

