【问题标题】:One to Many Relationship not showing in the object Amplify Schema definition对象 Amplify Schema 定义中未显示一对多关系
【发布时间】:2020-12-22 06:01:30
【问题描述】:

我不熟悉将 amplify 与 GraphQL 一起使用。我正在设置我的数据库架构并在运行放大推送后自动生成函数。

我想实现但不知道如何实现的目标

  1. 我希望能够在从 getUser 返回的对象中获取具有所有关联信息(具有一对一和一对多关系)的用户
  2. 我希望仍然能够获取 userByUserName 并查看所有连接的一对多关系

调用API生成函数获取用户时,

let user = await API.graphql(graphqlOperation(getUser,{id:userId}))

我正在取回一个用户对象,但是,它看起来像这样 - 尽管我确信数据库中的数据设置正确。

buttons: {nextToken: null} -- WANT THIS TO INCLUDE ACTUAL INFORMATION ABOUT BUTTONS CONNECTED TO THIS USER
createdAt: "2020-09-02T23:41:12.278Z"
customStyles: {id: "e3d1bbef-ec6f-4a6d-9b5d-e693e890d4e0", bgColor: "F9FF9F", bgBtnColor: "FFFFFF", bgBtnHoverColor: "000000", textColor: "000000", …}
defaultStyles: null
email: "nata@email.edu"
firstName: "Nata"
id: "d683a6bb-383e-4cf1-943a-05b3da4e5cc3"
lastName: "Vache"
socialNetwork: {nextToken: null} -- WANT THIS TO INCLUDE ACTUAL INFORMATION ABOUT SOCIAL NETWORKS CONNECTED TO THIS USER, THE SAME WAY AS FOR EXAMPLE customStyles IS SHOWN. 
updatedAt: "2020-09-02T23:41:12.278Z"
userName: "Nata568"

type User @model @key(name: "byUserName", fields: ["userName"], queryField: "userByUserName"){
  id: ID!
  firstName: String!
  lastName: String!
  userName: String!
  email: String!
  socialNetwork: [UserSocialNetwork] @connection(keyName: "UserSocialNetworkUser", fields: ["id"])
  buttons: [Button] @connection(keyName: "ButtonUser", fields: ["id"])
  defaultStyles: DefaultStyle @connection
  customStyles: CustomStyle @connection
}

type UserSocialNetwork @model @key(name: "UserSocialNetworkUser", fields: ["userID", "id"], queryField:"userSocialNetworkByUserID") {
  id: ID!
  socialNetworkUsername: String!
  userID: ID!
  supportedSocialNetwork: SupportedSocialNetwork! @connection
}

type SupportedSocialNetwork @model {
  id: ID!
  name: String!
  address: String!
}

type Button @model @key(name: "ButtonUser", fields: ["userID", "id"], queryField: "buttonByUserID") {
  id: ID!
  name: String!
  address: String!
  image: String
  userID: ID!
}

此架构不包括我的所有模型定义 - customStyles、defaultStyles 和其他,但它们是一对一的关系,运行良好。我遇到了一对多关系的问题,例如用户到 UserSocialNetwork 和用户到按钮。

我在 AWS Amplify Docs 上阅读了很多关于这方面的资源,浏览了一些示例,但仍然没有找到任何可以让我从 getUser 调用的连接中获取信息并赋予我能力的东西通过用户名获取用户。 任何意见将不胜感激!!!

【问题讨论】:

  • 如果这能解释您的问题的解决方案,您能否接受我的回答:)

标签: amazon-web-services aws-amplify graphql-js amplifyjs graphql-schema


【解决方案1】:

这是查询深度的问题。默认为2,需要增加它(在你的情况下为4)。

您可以按照以下步骤解决此问题。 在项目根目录下的 cmd 中(通常在其中运行放大命令)。

  1. 运行amplify codegen configure - 这将再次提示配置。
  2. 为此选项输入4 Enter maximum statement depth [increase from default if your schema is deeply nested]
  3. 运行amplify codegen - 这将根据新的深度创建您的查询和突变。

您可以通过检查grapgql/queries.js来验证它。

之前你可以在grapgql/queries.jsgetUser 查询中看到下面的片段,

buttons {
  nextToken
}

但是按照上述解决步骤后,它应该类似于下面。

buttons {
    items {
        id
        image
        address
      }
  }

最后再次查询你的用户。

【讨论】:

    【解决方案2】:

    一般评论:如果用户名是唯一的,您可以使用它作为 id 而不是创建额外的索引。如果不是,则此架构将出现问题,因为它无法执行 getOperation 而是执行可能返回多个答案的查询。

    (Appsync 中的解析器希望默认使用dynamoDB.get(设计),但使用索引将是dynamoDB.query,这会导致很多问题)

    无论如何使用您的架构我可以让它在使用 id 时正常工作

      "data": {
        "getUser": {
          "createdAt": "2020-09-07T13:54:23.440Z",
          "email": "meax",
          "firstName": "Max",
          "id": "19a752ec-5050-4e02-8ff8-05d9523e7ea5",
          "socialNetwork": {
            "items": [
              {
                "socialNetworkUsername": "What",
                "id": "280ec8ea-5b25-46d3-8f22-f170e3210146",
                "userID": "19a752ec-5050-4e02-8ff8-05d9523e7ea5"
              }
            ]
          },
          "lastName": "Sc",
          "userName": "zanndo",
          "updatedAt": "2020-09-07T13:54:23.440Z",
          "buttons": {
            "items": [
              {
                "id": "65971568-b388-40a3-b99e-1bff0a730161",
                "image": null,
                "address": "ButonAdre"
              }
            ]
          }
        }
      }
    }
    

    这是我的问题

    getUser(id: "19a752ec-5050-4e02-8ff8-05d9523e7ea5") {
        createdAt
        email
        firstName
        id
        socialNetwork {
          items {
            socialNetworkUsername
            id
            userID
          }
        }
        lastName
        userName
        updatedAt
        buttons {
          items {
            id
            image
            address
          }
        }
      }
    }
    

    这是我在电子邮件中设置 id 的地方。

    query MyQuery {
      getUser(id: "sw@gmail.com") {
        id
        firstName
        lastName
        socialNetwork {
          items {
            socialNetworkUsername
            supportedSocialNetwork {
              name
              id
              address
            }
          }
        }
        buttons {
          items {
            id
            address
            name
          }
        }
      }
    }
    

    同样有效

    {
      "data": {
        "getUser": {
          "id": "sw@gmail.com",
          "firstName": "S",
          "lastName": "W",
          "socialNetwork": {
            "items": [
              {
                "socialNetworkUsername": "SomeUserNameOrSomething",
                "supportedSocialNetwork": {
                  "name": "Supported1",
                  "id": "daf52246-4b25-402c-9fdd-46f8f35e1b89",
                  "address": "SupportedAddr"
                }
              }
            ]
          },
          "buttons": {
            "items": [
              {
                "id": "9883bd91-a2f1-479d-ab65-7a4bbe7b2dc4",
                "address": "ButtonAddr",
                "name": "Button1"
              }
            ]
          }
        }
      }
    }
    

    使用您的索引获得奖励

      userByUserName(userName: "SW") {
        items {
          buttons {
            items {
              name
              id
            }
          }
          socialNetwork {
            items {
              socialNetworkUsername
              supportedSocialNetwork {
                name
              }
            }
          }
        }
      }
    
    "userByUserName": {
          "items": [
            {
              "buttons": {
                "items": [
                  {
                    "name": "Button1",
                    "id": "9883bd91-a2f1-479d-ab65-7a4bbe7b2dc4"
                  }
                ]
              },
              "socialNetwork": {
                "items": [
                  {
                    "socialNetworkUsername": "SomeUserNameOrSomething",
                    "supportedSocialNetwork": {
                      "name": "Supported1"
                    }
                  }
                ]
              }
            }
          ]
        }
    

    这是我使用的架构

    type User @model @key(name: "byUserName", fields: ["userName"], queryField: "userByUserName"){
      firstName: String!
      lastName: String!
      userName: String!
      id: String!
      socialNetwork: [UserSocialNetwork] @connection(keyName: "UserSocialNetworkUser", fields: ["id"])
      buttons: [Button] @connection(keyName: "ButtonUser", fields: ["id"])
    }
    
    type UserSocialNetwork @model @key(name: "UserSocialNetworkUser", fields: ["userID", "id"], queryField:"userSocialNetworkByUserID") {
      id: ID!
      socialNetworkUsername: String!
      userID: String!
      supportedSocialNetwork: SupportedSocialNetwork! @connection
    }
    
    type SupportedSocialNetwork @model {
      id: ID!
      name: String!
      address: String!
    }
    
    type Button @model @key(name: "ButtonUser", fields: ["userID", "id"], queryField: "buttonByUserID") {
      id: ID!
      name: String!
      address: String!
      image: String
      userID: String!
    }
    

    也许我误解了什么?

    【讨论】:

    • 您的回答是否表明我们需要使用自定义查询来解决此问题?我更多地认为我们可以使用放大生成的函数 getUser 和 userByUserName。当我查看您的架构时,我没有看到太多变化,我假设最初那里有一些错误。您提供的对象数据是我希望在 getUser 和 userByUserName 上看到的,但不确定您是否通过创建自定义查询来实现。
    • 不,我只是用你的模式运行了很多,还是“自定义查询”指的是 GraphQL 查询? Amplify 的自动生成远非完美(尤其是在某些连接中)。您可能想检查您的数据库是否对我的查询给出了正确的答案。如果是这样,您可以检查您的“深度级别”是否不够深,无法让 Amplify 创建正确的查询。也许您的自动生成的查询是错误的(很容易发生)?你检查过吗?
    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多