3

我是使用 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 调用上的连接中获取信息并让我能够获得按用户名的用户。任何输入将不胜感激!!!

4

2 回答 2

5

这是查询深度的问题。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

getUser之前您可以在查询中看到以下片段grapgql/queries.js

buttons {
  nextToken
}

但是按照上述解决步骤后,它应该如下所示。

buttons {
    items {
        id
        image
        address
      }
  }

最后再次查询您的用户。

于 2021-01-03T06:28:27.220 回答
1

一般评论:如果用户名是唯一的,您可以将其用作 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!
}

也许我误解了什么?

于 2020-09-07T14:30:00.353 回答