GraphQL,1-1 关系突变
Posted
技术标签:
【中文标题】GraphQL,1-1 关系突变【英文标题】:GraphQL, 1-1 relation mutation 【发布时间】:2018-07-08 17:20:57 【问题描述】:我正在尝试使用 NodeJS 和 Prisma 实现我自己的 GraphQL 后端。
目前,我只有两种简单的类型:
用户:
type User
id: ID! @unique
email: String!
address: Address! @relation(name:"UserAddress")
地址:
type Address
id: ID! @unique
name: String!
user: User! @relation(name:"UserAddress")
还有一个简单的突变,创建一个用户,通过以下方式解决:
async signup(parent, email, ctx, info)
return ctx.db.mutation.createUser(
data: email,
)
但这不起作用,因为在创建用户时,我省略了它的地址。我知道我应该在数据中添加一个带有该用户 ID 的地址字段,但是因为我们正在创建它,所以我们现在无法访问它。如何解决这个问题? (我希望这在服务器中完成,如果可能的话,保持 ! 和原子性,否则如果这是诀窍,可以分成 2 个突变?)。
最好的。
【问题讨论】:
【参考方案1】:如果您不打算在创建新用户时始终提供地址,我建议您将地址字段设置为可选。否则,无论您采取了多少步骤以及执行速度有多快,都有总是潜在的查询会返回错误的时刻。
TBH,我什至不明白你为什么希望它是必需的。我相信你可以不用,或者,如果它真的是强制性的,你应该“强迫”用户在注册时/之后填写这些详细信息。但是,在架构中保持它是可选的。
如果您在注册时要求提供地址信息,按照我的看法,您可以通过 2 种方式进行处理。无论哪种方式,仍然会有一个解析器。而且,是的,您可以根据需要标记 address 字段
-
如果您将地址与其他用户信息保存在同一个文档中,那么事情就很简单了,您只需在一个查询中将所有内容写入数据库即可。
如果 Address 和 User 是单独的实体,仍然是一个解析器,但涉及更多步骤,并且您也可以通过两种方式进行:
你保存用户,等待响应获取id
,将user_id
字段添加到地址并保存。保存地址后,您需要通过添加address_id
字段来更新用户。
如果您使用的是 mongodb,那么您绝对没有理由不自己生成这些 id。使用new ObjectId()
,在需要的地方添加它们,然后保存用户和地址。这样你也可以返回一个乐观的响应,或者只是等待两个操作完成。
【讨论】:
感谢您的回答,我认为对于此示例,您是对的。但是,假设我在注册时询问其地址,我应该如何编写解析器以在注册时创建地址? (在一个或两个操作中,该字段是否为必填项) 我已经编辑了原始答案,因为评论太长了。 谢谢,我明白不能在一个操作中完成(假设有 2 个不同的实体),谢谢! 您可以使用嵌套创建或嵌套连接,如下所述:prismagraphql.com/docs/reference/prisma-api/…以上是关于GraphQL,1-1 关系突变的主要内容,如果未能解决你的问题,请参考以下文章
graphql/graphcool:如何编写一个连接一对一和一对多关系的突变
Prisma、GraphQL 和 Apollo 中具有突变的数据关系和连接类型