GraphCool 域模型设计 - ModifiedBy 属性带来麻烦
GraphCool Domain Model Design - ModifiedBy attribute giving trouble
我正在尝试使用 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.
我了解每个非标量传出 graphcool 都希望建立双向关系。但是考虑 modifiedBy 和 createdBy(用户)的用例,我不能为我添加的每个实体在用户对象上建立关系。
在 GraphCool 上执行此操作的更好方法是什么?
还有,为什么GraphCool要有这个限制,GraphQL没有规定这个限制?
干杯
罗希特
感谢使用Graphcool!
要事第一。正如您所指出的,当您想要连接类型时,Graphcool 会强制执行双向关系。在某些情况下,您预先知道您只想在一个方向上查询数据,因此您必须创建双向关系可能看起来不直观。
这是因为 Graphcool 权限系统允许您根据数据结构简洁地指定权限规则。在您的情况下,您可能希望指定只允许 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")
}
(请注意关系名称必须以大写字母开头)
希望对您有所帮助:-)
我正在尝试使用 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.
我了解每个非标量传出 graphcool 都希望建立双向关系。但是考虑 modifiedBy 和 createdBy(用户)的用例,我不能为我添加的每个实体在用户对象上建立关系。
在 GraphCool 上执行此操作的更好方法是什么?
还有,为什么GraphCool要有这个限制,GraphQL没有规定这个限制?
干杯 罗希特
感谢使用Graphcool!
要事第一。正如您所指出的,当您想要连接类型时,Graphcool 会强制执行双向关系。在某些情况下,您预先知道您只想在一个方向上查询数据,因此您必须创建双向关系可能看起来不直观。
这是因为 Graphcool 权限系统允许您根据数据结构简洁地指定权限规则。在您的情况下,您可能希望指定只允许 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")
}
(请注意关系名称必须以大写字母开头)
希望对您有所帮助:-)