Вложенный запрос — Graphql

#graphql #react-apollo #apollo-client #graphql-js

#graphql #react-apollo #apollo-клиент #graphql-js

Вопрос:

У меня есть typeDefs, который не возвращает вложенный объект

Я хотел бы запросить квартиру с помощью, у которой есть владелец и документ во вложенном запросе, но он возвращает null.

файл содержит ссылку на соответствующий файл данных.

 const apartments = require('./data/apartment.json');
const person = require('./data/person.json');
const document = require('./data/document.json');
  

запрос apartment возвращается правильно, но вложенная информация (владелец и соответствующие документы) возвращает значение null

 query {
  apartments{
    id
    code
    owner{
      id
      name
      document{
        name
        type
      }
    }
  }


const typeDefs = gql`
type Query {
  apartments(
    id:ID
    code: String
    description: String
    createdAt: String
    updatedAt: String  
  ): [Apartment]
  person:[Person]
}
type Apartment {
  id: ID
  code: String
  description: String
  owner:[Person]
  createdAt: String
  updatedAt: String
}
type Person {
  id: ID
  name: String
  document: [Document]
  createdAt: String
  updatedAt: String
}
type Document {
  id: ID
  name: String
  type: String
  number: String
  createdAt: String
  updatedAt: String
}
`
  

это распознаватель

 const resolvers = {
  Query: {
    apartments: () => {
      return apartments;
    },
    person: () => {
      return person;
    },
    document: () => {
      return document;
    }
  }
}
  

кто-нибудь может помочь извлечь вложенные данные?

Комментарии:

1. Ваша схема GraphQL и запрос выглядят правильными для меня. Однако я не могу догадаться, как работает ваш распознаватель, куда вам нужно вложить объекты

2. сервер? образец данных о квартире? покажите преобразователи, насколько они связаны?

3. просто не связано … нет распознавателя полей владельца, указывающего на данные пользователя

Ответ №1:

Мне не хватало преобразователя, поэтому я обновил поле для пользователей и обновил преобразователь

 people(parent) {
      return people.filter(person => person.apartmentId === parent.apartmentId);
    }
  

Это новая схема

 // Schema definition
const typeDefs = gql`

# A Block has a blockName and Apartments
  type Block {
    blockName: String!
    blockCode: String!
    apartments: [Apartment!]
  }

  # A Apartment has a apartmentId and people
  type Apartment {
    apartmentId: String!
    people: [Person!]
  }

  # People has a name
  type Person {
    personName: String!
  }

  # Queries can fetch a list of libraries
  type Query {
    blocks: [Block]
  }
`;
  

теперь карта преобразователя выглядит следующим образом:

 // Resolver map
const resolvers = {
  Query: {
    blocks() {

      // Return our hardcoded array of blocks
      return blocks;
    }
  },
  Block: {
    apartments(parent) {

      // Filter the hardcoded array of blocks to only include the respective apartment in the blockName
      return apartments.filter(apartment => apartment.blockName === parent.blockName);
    }
  },
  Apartment: {

    // filter all the people that live at the same apartment
    people(parent) {
      return people.filter(person => person.apartmentId === parent.apartmentId);
    }
  }
};
  

и вложенный запрос выглядит следующим образом

 query GetPeopleByBlockAndApartment {
  blocks {
    blockCode
    blockName
    apartments {
      apartmentId
      people {
        personName
      }
    }
  }
}
  

Большое спасибо всем, кто пытался помочь.