AWS Amplify GraphQL中用Union定义@hasMany关联报错求助
问题根源与解决方案
问题原因
你遇到的Could not find related type with name User错误,本质是AWS Amplify的GraphQL关系指令(如@hasMany)不支持关联Union类型。
Amplify的@model指令会生成对应的数据库表,而@hasMany、@belongsTo等关系指令依赖数据库表之间的外键关联来实现数据关系。但User是Union类型,它只是Student和Teacher两种类型的组合,没有对应的数据库实体表,Amplify无法识别并建立这种关联关系。
可行解决方案
方案1:拆分关联,分别关联Student和Teacher
直接在Chat中分别定义与Student、Teacher的关联,避免使用Union:
type Student @model { username: String! firstName: String! lastName: String! chats: [Chat] @hasMany(indexName: "byStudent", fields: ["id"]) } type Teacher @model { username: String! firstName: String! lastName: String! chats: [Chat] @hasMany(indexName: "byTeacher", fields: ["id"]) } type Chat @model { students: [Student] @hasMany(indexName: "byChat", fields: ["id"]) teachers: [Teacher] @hasMany(indexName: "byChat", fields: ["id"]) messages: [Message] @hasMany } type Message @model { senderStudent: Student @belongsTo(fields: ["senderStudentId"]) senderTeacher: Teacher @belongsTo(fields: ["senderTeacherId"]) content: String! chat: Chat! @belongsTo createdAt: AWSDateTime! }
这种方式的缺点是Message的发送者需要区分学生和老师,查询时要判断两个字段。
方案2:使用接口替代Union
将User定义为带@model的接口,让Student和Teacher实现该接口,Amplify支持接口作为关联类型:
interface User @model { id: ID! username: String! firstName: String! lastName: String! } type Student implements User @model { id: ID! username: String! firstName: String! lastName: String! chats: [Chat] @hasMany } type Teacher implements User @model { id: ID! username: String! firstName: String! lastName: String! chats: [Chat] @hasMany } type Chat @model { users: [User] @hasMany messages: [Message] @hasMany } type Message @model { sender: User! @belongsTo content: String! chat: Chat! @belongsTo createdAt: AWSDateTime! }
这种方式更贴近你原本的设计,查询时可以通过接口统一处理用户类型。
方案3:使用中间表实现多对多关联
对于Chat和User的多对多关系,用中间表ChatUser来关联Chat与Student/Teacher,这是Amplify中实现复杂多对多的标准方式:
type Student @model { username: String! firstName: String! lastName: String! chatUsers: [ChatUser] @hasMany } type Teacher @model { username: String! firstName: String! lastName: String! chatUsers: [ChatUser] @hasMany } type Chat @model { chatUsers: [ChatUser] @hasMany messages: [Message] @hasMany } type ChatUser @model { chat: Chat! @belongsTo student: Student @belongsTo(fields: ["studentId"]) teacher: Teacher @belongsTo(fields: ["teacherId"]) } type Message @model { senderStudent: Student @belongsTo(fields: ["senderStudentId"]) senderTeacher: Teacher @belongsTo(fields: ["senderTeacherId"]) content: String! chat: Chat! @belongsTo createdAt: AWSDateTime! }
这种方式灵活性最高,适合后续扩展更多用户类型的场景。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

