简体   繁体   中英

GraphQL query omitting null fields for different type objects

I am using Apollo Graphql for getting a list of different models or types. I tried to use inhirit, but I didn't get it. I was trying to use whole object, but I want to ommit the fields that I don't need.

I created my schema type with nullables fields, because all objects don't have all fields.

I will explain better with the next example:

This is a simple example class (OBJECT) design:

car {
    name: String
    wheelNumber: Integer
}

trunk extends car {
    cargoSize: Integer
}

So I created my Graphql Schema with this way:

input vehicleInput {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type vehicle {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type Query {
    vehicles: [vehicle]
}

type Mutation {
    addVehicle(input: vehicleInput ): vehicle!
}

Resolver example:

import { vehicle } from "./model";

export const resolvers = {
  Query: {
    vehicles : () => {
        return vehicle.find({});
      },
  },
  Mutation: {
    addVehicle: (_, { input }) => {
      const inputResponse = vehicle.create(input);
      return inputResponse;
    },
  }
};

When I execute vehicles query it returns all fields also if the object doesn't have cargoSize field, it returns cargoSize: null .

query {
  vehicles {
    name
    wheelNumber
    cargoSize
  }
}

I would like to ommit cargoSize field when it is null. Like this:

{
    vehicles: [
        {
            name: "car 1",
            wheelNumber: 4
        },
        {
            name: "car 2",
            wheelNumber: 4
        },  
        {
            name: "truck 1",
            wheelNumber: 8,
            cargoSize: 65
        },    
        {
            name: "car 3",
            wheelNumber: 4
        },                     
    ]
}

Instead of this:

{
    vehicles: [
        {
            name: "car 1",
            wheelNumber: 4,
            cargoSize: null
        },
        {
            name: "car 2",
            wheelNumber: 4,
            cargoSize: null
        },  
        {
            name: "truck 1",
            wheelNumber: 8,
            cargoSize: 65
        },    
        {
            name: "car 3",
            wheelNumber: 4,
            cargoSize: null
        },                     
    ]
}

Are any way to do that? I have been researching, but I haven't found anything about it.

I got it. I didn't see Graphql has Interfaces. So well I declared an Interface and then I implement every type.

interface vehicle {
    name: String,
    wheelNumber: Integer
}


type car implements vehicle {
    name: String,
    wheelNumber: Integer
}

type truck implements vehicle {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type Query {
    vehicles: [vehicle]
}

type Mutation {
    addVehicle(input: vehicleInput ): vehicle!
}

Resolver file:

import { vehicle } from "./model";

export const resolvers = {
  Query: {
    vehicles : () => {
        return vehicle.find({});
      },
  },
  Mutation: {
    addVehicle: (_, { input }) => {
      const inputResponse = vehicle.create(input);
      return inputResponse;
    },
  },
  vehicle: {
    __resolveType: (obj) => {
      if(obj.cargoSize){
        return 'truck';
      }
      else{
        return 'car'
      }      
  }
};

With that I complete the API. Then for making query I just have to specify all the common fields and then using the keyword ... on and specify all trunk fields:

query {
  vehicles {
    name
    wheelNumber
    ... on truck {
        cargoSize
    }
  }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM