我正在尝试使用Graphcool为我们的产品设计一个后端。我们已经有了产品的领域模型。
我面临的问题是非标量属性,其中我被迫使用@relation (也就是双向关系)。
帮助我设计以下情况
# projectId: cj4dsyc7ur8cc0142s3hesy1r
# version: 2
type File implements Node {
contentType: String!
createdAt: DateTime!
id: ID! @isUnique
name: String!
secret: String! @isUnique
size: Int!
updatedAt: DateTime!
url: String! @isUnique
}
type User implements Node {
createdAt: DateTime!
email: String @isUnique
id: ID! @isUnique
password: String
updatedAt: DateTime!
}
type Record implements Node {
createdAt: DateTime!
id: ID! @isUnique
name: String!
description: String!
createdBy: User!
modifiedBy: User!
}为此,我得到了错误
Errors
createdBy: The relation field `createdBy` must specify a `@relation` directive: `@relation(name: "MyRelation")`
modifiedBy: The relation field `modifiedBy` must specify a `@relation` directive: `@relation(name: "MyRelation")`然后,当我试图添加关系时,我被迫执行以下操作
# projectId: cj4dsyc7ur8cc0142s3hesy1r
# version: 2
type File implements Node {
contentType: String!
createdAt: DateTime!
id: ID! @isUnique
name: String!
secret: String! @isUnique
size: Int!
updatedAt: DateTime!
url: String! @isUnique
}
type User implements Node {
createdAt: DateTime!
email: String @isUnique
id: ID! @isUnique
password: String
updatedAt: DateTime!
}
type Record implements Node {
createdAt: DateTime!
id: ID! @isUnique
name: String!
description: String!
createdBy: User! @relation(name: "createdBy")
modifiedBy: User! @relation(name: "modifiedBy")
}这将导致以下错误
Errors
createdBy: A relation directive with a name must appear exactly 2 times.
modifiedBy: A relation directive with a name must appear exactly 2 times.我理解每一个非标量输出图形酷期待建立一个双向关系。但是,考虑到modifiedBy和createdBy (用户)的用例,我不能为我添加的每个实体在用户对象上建立关系。
在GraphCool上做这件事的更好的方法是什么?
另外,为什么这个限制是由GraphCool提出的,GraphQL没有规定这个限制?
干杯,罗希特
发布于 2017-06-28 18:36:54
谢谢你使用图形酷!
首先要做的是。正如您所指出的,图形酷在您想连接类型时强制执行双向关系。在某些情况下,您预先知道您只想在一个方向查询数据,因此,您必须创建一个双向关系似乎是不直观的。
造成这种情况的原因是允许您根据数据的结构简洁地指定权限规则。在您的情况下,您可能需要指定只允许post的创建者删除记录。
实际上,在实现权限规则时,常常需要反向关系。实施双向关系使整个编程模型更容易理解,并使您能够轻松地实现权限规则。
对于您的模式,解决方案是按以下方式扩展用户类型:
type User implements Node {
createdAt: DateTime!
email: String @isUnique
id: ID! @isUnique
password: String
updatedAt: DateTime!
createdRecords: [Record!]! @relation(name: "CreatedBy")
modifiedRecords: [Record!]! @relation(name: "UpdatedBy")
}(请注意,关系名称必须以大写字母开头)
希望这有帮助:)
https://stackoverflow.com/questions/44809470
复制相似问题