我正在尝试使用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都希望建立一种2关系。但是考虑一下ModifyBy和createdBy(用户)的用例,我不能为我添加的每个实体在User对象上都放一个关系。

在GraphCool上执行此操作的更好方法是什么?

另外,为什么此限制由GraphCool提出,而GraphQL却没有规定此限制?

干杯
罗希特

最佳答案

感谢您使用Graphcool!

首先是第一件事。正如您指出的那样,当您要连接类型时,Graphcool会强制执行双向关系。在某些情况下,您预先知道只想在一个方向上查询数据,因此必须创建双向关系似乎并不直观。

这是因为Graphcool权限系统使您可以根据数据的结构简洁地指定权限规则。在您的情况下,您可能希望指定仅允许帖子的创建者删除记录。

实际上,事实证明,当您实现权限规则时,最终最终需要反向关系。强制双向关系使整个编程模型更易于理解,并使您可以轻松实施许可规则。

对于您的架构,一种解决方案是按以下方式扩展User类型:

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 - GraphCool域模型设计-ModifiedBy属性给您带来麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44809470/

10-11 17:27