Mysql
 sql >> Datenbank >  >> RDS >> Mysql

GraphQL - Berechneten Typ abhängig vom Argument zurückgeben

Joes Antwort (append {"name":"ratio" , value:data.active/data.total} zum Ergebnis, sobald das Ergebnis aus der Datenbank abgerufen wird) würde dies tun, ohne Schemaänderungen vorzunehmen.

Als alternative Methode oder als elegantere Methode in GraphQL können die Feldnamen im Typ selbst angegeben werden, anstatt sie als Argumente zu übergeben. Und berechnen Sie ratio durch Schreiben eines Resolvers.

Das GraphQL-Schema wäre also:

Item {
  total: Int,
  active: Int,
  ratio: Float
}

type Query {
  items: [Item]
}

Der Client spezifiziert die Felder:

{
  items {
    total 
    active 
    ratio
  }
}

Und ratio kann innerhalb des Resolvers berechnet werden.

Hier ist der Code:

const express = require('express');
const graphqlHTTP = require('express-graphql');
const { graphql } = require('graphql');
const { makeExecutableSchema } = require('graphql-tools');
const getFieldNames = require('graphql-list-fields');

const typeDefs = `
type Item {
  total: Int,
  active: Int,
  ratio: Float
}

type Query {
  items: [Item]
}
`;

const resolvers = {
  Query: {
    items(obj, args, context, info) {
      const fields = getFieldNames(info) // get the array of field names specified by the client
      return context.db.getItems(fields)
    }
  },
  Item: {
    ratio: (obj) => obj.active / obj.total // resolver for finding ratio
  }
};

const schema = makeExecutableSchema({ typeDefs, resolvers });

const db = {
  getItems: (fields) => // table.select(fields)
    [{total: 10, active: 5},{total: 5, active: 5},{total: 15, active: 5}] // dummy data
}
graphql(
  schema, 
  `query{
    items{
      total,
      active,
      ratio
    }
  }`, 
  {}, // rootValue
  { db } // context
).then(data => console.log(JSON.stringify(data)))