【问题标题】:How to connect Many-to-one relations in FaunaDB如何在 FaunaDB 中连接多对一关系
【发布时间】:2021-09-25 05:09:50
【问题描述】:

我已将以下 GraphQL 架构上传到我的 FaunaDB:

type RSheet @collection(name: "sheets") {
  columns: [RColumn!]! @relation
  sections: [RSection]!
}

type RColumn @collection(name: "columns") {
  label: String!
  sheet: RSheet!
}

type RSection @embedded {
  label: String
  items: [[RItem!]]!
}

type RItem @embedded {
  value: String
  form: RItemForm
  column: RColumn!
}

enum RItemForm {
  STRING
}

这是一张包含列和多个部分的工作表,其中包含构成表格行的项目。


现在,我创建了一个工作表和两列。

“表格”数据库中的集合

{
  "ref": Ref(Collection("sheets"), "304268724760740364"),
  "sections": [
    {
      "label": null,
      "items": []
    }
  ]
}

“列”数据库中的集合

{
  "ref": Ref(Collection("columns"), "304268724764934668"),
  "label": "Begin",
  "sheet": Ref(Collection("sheets"), "304268724760740364")
},
{
  "ref": Ref(Collection("columns"), "304268724776469004"),
  "label": "End",
  "sheet": Ref(Collection("sheets"), "304268724760740364")
}

到目前为止,这一切都很好。我可以创建工作表和/或列、更新和删除它们。


但是,如果我想使用 FaunaDB 的 GraphQL 添加部分项目,我不能 connect 项目的列。我收到一条错误消息,指出我必须提供该列的 ID!:

当我这样做时,只会将 ID 写入数据库,并且不会创建连接 Ref(…):

“表格”数据库中的集合

{
    "ref": Ref(Collection("sheets"), "304268724760740364"),
    "sections": [
      label: null
      {
        "items": [
          [
            {
              "value": "Item 1",
              "column": "304268724791149068"  /// EXPECTED: Ref(Collection("columns"), "304268724791149068")
            }
          ]
        ]
      }
    ]
  }

我错过了什么?

【问题讨论】:

    标签: graphql faunadb


    【解决方案1】:

    您不能在嵌入类型中创建关系。来自docs on relations:

    关系识别算法会查看所有非嵌入类型的每个字段

    我确实认为通过@embedded 类型建立关系会很好,但这不是它们的真正用途,因此不受支持。

    您将需要重新设计架构,以便每个连接都是非嵌入式类型。另外,二维数组也不可能有连接。

    示例

    考虑以下架构

    type RSheet @collection(name: "sheets") {
      columns: [RColumn!]! @relation
      sections: [RSection]! @relation
    }
    
    type RColumn @collection(name: "columns") {
      label: String!
      sheet: RSheet! @relation
      items: [RItem!] @relation
    }
    
    type RSection @collection(name: "section") {
      label: String
      sheet: RSheet @relation
      items: [RSectionItemList!]! @relation
    }
    
    type RSectionItemList @collection(name: "section_item_list") {
      section: RSection! @relation
      items: [RItem!]! @relation
    }
    
    type RItem @collection(name: "item") {
      value: String
      form: RItemForm
      column: RColumn! @relation
      list: RSectionItemList @relation
    }
    
    enum RItemForm {
      STRING
    }
    

    请注意我如何将二维数组拆分为包装列表对象列表。

    可以这样创建工作表和列:

    还有这样添加的项目:

    【讨论】:

    • 哇,我一定忽略了有关嵌入类型的信息。非常感谢您的回答和您为此付出的努力!这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多