AWS Amplify生成GraphQL嵌套mutation时CreateRoutineInput无days属性报错
根本原因
这不是GraphQL协议层面不支持嵌套关联创建,是AWS Amplify CLI默认的Schema生成逻辑的设计限制
- 自动生成的
CreateRoutineInput类型仅包含Routine模型自身的标量字段,不存在days这类嵌套关联字段,这是Amplify一对多关系建模的默认规则。 - 你在
createRoutine的mutation返回定义里看到的嵌套days、exercises查询结构,是查询响应的返回字段定义,和传入的输入参数类型是完全独立的两套类型定义,不能直接混用。
生成规则细节
Amplify CLI处理你定义的两层一对多关系(Routine 1:N Day,Day 1:N Exercise)时,默认的转换逻辑为:
- 关联双方必须作为独立实体创建
- 关联关系通过各表的外键字段绑定:Day表存
routineID指向所属Routine,Exercise表存dayID指向所属Day - 所有自动生成的
CreateXxxInput类型,只会包含当前模型自身的属性,不会预置嵌套关联实体的输入结构
你传入的days属性从根源上就不在CreateRoutineInput的类型定义里,TypeScript自然会抛出属性不存在的类型校验错误。
符合默认Schema设计的实现方式
要创建带完整层级关联的训练计划,需要分步发起独立的mutation:
- 先调用
createRoutine创建训练计划主记录,获取返回的Routineid - 逐个调用
createDay创建训练日记录,在输入参数中填入上一步拿到的routineID完成外键绑定 - 按训练日逐个调用
createExercise创建动作记录,在输入参数中填入对应所属训练日的id完成外键绑定
可选优化
如果需要减少网络往返次数,可以在同一个GraphQL请求中批量提交多个独立的创建mutation,一次性完成多层级记录的创建,但本质上还是多个独立的创建操作,并非在createRoutine的输入参数中嵌套关联对象。
如果确实需要支持在createRoutine的输入中直接嵌套创建关联的Day和Exercise,需要手动调整Amplify的模型装饰器配置,自定义输入类型的结构,默认的CLI生成配置不会开启这个能力。
内容的提问来源于stack exchange,提问作者Jarrod Watts
相关产品推荐
相关产品推荐

