一对多关系未显示在对象Amplify Schema定义中

问题描述

我是初次使用GraphQL放大功能。我正在运行放大推送后设置数据库模式并自动生成函数

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

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

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

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

我正在找回一个用户对象,尽管它肯定可以确保数据库中的数据设置正确,但它看起来像这样。

buttons: {nextToken: null} -- WANT THIS TO INCLUDE ACTUAL @R_4_4045@ION 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: "[email protected]"
firstName: "Nata"
id: "d683a6bb-383e-4cf1-943a-05b3da4e5cc3"
lastName: "Vache"
socialNetwork: {nextToken: null} -- WANT THIS TO INCLUDE ACTUAL @R_4_4045@ION 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",queryField: "buttonByUserID") {
  id: ID!
  name: String!
  address: String!
  image: String
  userID: ID!
}

此架构并不包括我的所有模型定义-customStyles,defaultStyles和其他模型定义,但它们是一对一的关系,效果很好。我遇到了一对多关系的问题,例如User to UserSocialNetwork和User to Buttons。

我已经在AWS Amplify Docs上阅读了很多相关资源,通过示例进行了研究,但仍然找不到我可以使用的东西,这可以让我从getUser调用中的连接中获取信息,并且还使我能够通过用户名获取用户。 任何输入将不胜感激!!!

解决方法

这是查询深度的问题。默认情况下为 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
      }
  }

最后再次查询您的用户。

,

一般注释::如果用户名是唯一的,则可以将其用作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: "[email protected]") {
    id
    firstName
    lastName
    socialNetwork {
      items {
        socialNetworkUsername
        supportedSocialNetwork {
          name
          id
          address
        }
      }
    }
    buttons {
      items {
        id
        address
        name
      }
    }
  }
}

也可以

{
  "data": {
    "getUser": {
      "id": "[email protected]","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",queryField: "buttonByUserID") {
  id: ID!
  name: String!
  address: String!
  image: String
  userID: String!
}

也许我误会了什么?