Как инкапсулировать данные типа, характерные для родительского типа в graphql

У меня такой тип игры:

type Game {
  id: ID! @id
  goals: [Goal]
}

которые имеют отношение Цели к:

type Goal {
  id: Int! @id(strategy: SEQUENCE) @sequence(name: "IncID", initialValue: 1, allocationSize: 20)
  thumbnail: String!
  player: String!
  minute: Int!
}

то, что я пытаюсь сделать с помощью этого беспорядка с «id», - это создать добавочное значение идентификатора для цели с целью создания URL-адреса для каждой цели, например:

domaine.com/game/{id-of-the-game}/goal/{incremental-id(1,2..)}

проблема в том, что тип цели выглядит как отдельная сущность, он сохранит последний увеличенный идентификатор, даже если это новая игра.

поэтому я хочу сбросить последовательность идентификаторов для каждой новой игры.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, о чем вы просите, невозможно с помощью аннотации @id. Каждый тип в призменной модели должен иметь уникальный идентификатор для идентификации объекта в базе данных. Если используемой базовой базой данных является MongoDB, в ней будет коллекция целей с документами, каждая из которых представляет отдельную цель, идентифицированную идентификатором. Если в качестве базовой базы данных используется MySQL/PostgreSQL, цели будут храниться в таблице целей, где каждая строка представляет отдельную цель.

Каждый отдельный объект (независимо от того, хранится ли он как документ или строка) должен быть однозначно идентифицирован для доступа к нему и создания отношений, например. между объектами Goal и объектами Game.

Если бы идентификатор цели начинался с 1 для каждой игры, это нарушило бы уникальное ограничение для поля идентификатора, поскольку две цели в таблице или коллекции были бы идентифицированы одним и тем же идентификатором (например, 1).

Я бы предложил просто добавить что-то вроде поля «numberInGame» к типу цели и заполнить его при создании цели (например, принимая во внимание цели. длина в Game.type).

Надеюсь, что это помогло прояснить ограничение уникальности поля id.

Я использую postgres, и, делая то, что я пытаюсь сделать выше, будет несколько целей с одним и тем же идентификатором, что невозможно по определению. все, что мне нужно сделать, это создать еще одно поле для хранения возрастающего значения целей. это было глупо с моей стороны. спасибо пердокс.

Yassine Bridi 16.07.2019 18:51

Другие вопросы по теме