Как определить значения, указывающие c на соединение двух узлов в GraphQL? - PullRequest
0 голосов
/ 23 января 2020

В моей схеме есть два типа:

type Resident = {            type Visitor = {
  id                           id
  name                         name
}                            }

В моей базе данных:

Таблицы резидентов и посетителей:

+--------+-------+   +--------+---------+
| res_id | name  |   | vis_id | name    |
+--------+-------+   +--------+---------+
|  1     | Alice |   |  1     | Charlie |
|  2     | Bob   |   +--------+---------+
+--------+-------+

А затем таблица, которая показывает какой посетитель принадлежит какому резиденту:

+--------+--------+--------------+
| res_id | vis_id | relationship |
+--------+--------+--------------+
|      1 |      1 | fam/fri      |
|      2 |      1 | contractor   |
+--------+--------+--------------+

Каждый посетитель может быть резидентом «fam / fri» или «подрядчиком». Так что Чарльз ie является посетителем Алисы как ее семья или друг. Однако Чарль ie также является посетителем Боба, а не подрядчиком.

Вопрос : Как структурировать мою схему так, чтобы при запросе Алисы Чарль ie возвращается как fam / fri, и когда я запрашиваю Боба, Charl ie возвращается как подрядчик? Я представляю себе это:

{
  Resident(id: 1) {             "Resident" {
    name                           "Alice"
    Visitor {                      "Visitor" {
      id                ===>          "1"
      name                            "Charlie"
      relationship                    "fam/fri"
    }                              }
  }                             }
}

, а также:

{
  Resident(id: 2) {             "Resident" {
    name                           "Bob"
    Visitor {                      "Visitor" {
      id                ===>          "1"
      name                            "Charlie"
      relationship                    "contractor"
    }                              }
  }                             }
}

1 Ответ

1 голос
/ 23 января 2020

Что-то вроде:

type Query {
  resident(id: Int): Resident
}

type Resident {
  id: Int!
  name: String!
  visitors: [Visitor!]!
}

type Vistor {
  id: Int!
  name: String!
  relationship: VisitorRelationship!
}

enum VisitorRelationship {
  CONTRACTOR
  FAMILY_OR_FRIEND
}

Обратите внимание, что по соглашению имена полей должны быть camelCase , а имена типов должны быть в PascalCase . Если данные, возвращаемые из вашего источника данных (будь то база данных, API или что-то еще), не совпадают с формой, которую вы хотите вернуть из службы GraphQL, вам следует преобразовать данные, прежде чем возвращать их в свой преобразователь, для пример:

const relationshipMap = {
  'fam/fri': 'FAMILY_OR_FRIEND',
  'contractor': 'CONTRACTOR',
}

const resolvers = {
  Query: {
    resident: (root, args) => {
      const resident = await Resident.findById(args.id)
      // assuming resident has a property named joinTable that's
      // an array and each relationship has a property named visitor
      return {
        ...resident,
        visitors: resident.joinTable.map(relationship => {
          return {
            ...joinTable.visitor,
            relationship: relationshipMap[joinTable.relationship],
          }
        })
      }
    },
  },
}

Вы также можете сопоставить перечисления с пользовательскими значениями таким образом .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...