Prisma graphql вычисляемых полей - PullRequest
1 голос
/ 07 марта 2019

У меня есть эта модель данных:

type Item {
  id: ID! @unique
  title: String!
  description: String!
  user: User!
  pictures: [Picture]
  basePrice: Int!
  addons: [Addon]
}

Я пишу запрос parsedItem, который берет id из аргументов и ищет Item (используя запрос по умолчанию для Item, сгенерированный Prisma), что-то вродеthis:

 const where = { id: args.id };
 const item = await ctx.db.query.item({ where }, 
    `{
      id
      title
      ...

Мне нужно показать во внешнем интерфейсе вычисленное значение: «dynamicPrice» зависит от количества Аддонов, которые имеет Предмет.Например: Элемент № 1 имеет 3 дополнения, каждое дополнение имеет значение 5 долларов.Это вычисленное значение должно быть

dynamicPrice = basePrice + 3 * 5

Отношение Аддон может измениться, поэтому мне нужно вычислять это при каждом запросе, который выполняет интерфейс.

Я бы очень хотел сделать что-то вроде:

item.dynamicPrice = item.basePrice + (item.addons.length * 5)

и верните этот элемент в распознаватель, но это не работает.Это выдает ошибку:

"message": "Невозможно запросить поле \" dynamicPrice \ "для типа \" Item \ "."(, когда я пытаюсь запросить элемент из внешнего интерфейса )

Это сообщение об ошибке заставляет меня задуматься: я должен создать dynamicPrice как поле в модели данных?Могу ли я заполнить это поле в решателе запросов?Я знаю, что могу, но это хороший подход?

Это пример, мне нужно создать больше вычисляемых значений для этой модели Item.

Какое лучшее масштабируемое решение/ обходной путь для этого простого варианта использования?

1 Ответ

1 голос
/ 07 марта 2019

Вам необходимо создать распознаватель полей для dynamicPrice поля типа Item. Это будет выглядеть так:

const resolvers = {
  Query: {
    parsedItem: (parent, args, ctx, info) => {
      ...
    }
    ...
  },
  Item: {
    dynamicPrice: parent => parent.basePrice + parent.addons.length * 5
  }
}

Более подробную информацию вы можете найти на Руководство по общим шаблонам резольвера .

...