Node.js — Как получить связанные данные модели с помощью graphql?

#node.js #postgresql #graphql #sequelize.js #associations

Вопрос:

В Node.js приложение, которое я использую graphql для получения списка данных. Я создал две модели под названием School и Grade . Ассоциация для таких моделей, как Школа, имеет много классов, и класс принадлежит школе. При запросе я получаю null значение для связанной модели.

В модели school.js,

 module.exports = (sequelize, Sequelize) => {
 const School = sequelize.define("school", {
  name: {
   type: Sequelize.STRING,
  },
  email: {
    type: Sequelize.STRING,
  },
 });

 School.associate = function (models) {
  School.hasMany(models.Grade, { foreignKey: "school_id" });
 };

 return School;
};
 

В файле typeDefs.graphql,

 type Query {
  getSchoolDetails: [School]
  getSchoolDetail(id: ID!): School
  getGradeDetails: [Grade]
}

type School {
  id: ID!
  name: String
  email: String
  grades: [Grade]
}

type Grade {
  id: ID!
  school_id: ID!
  name: String
  school: School
}
 

В resolvers.js,

 const Query = {
 getSchoolDetails: async () => {
  try {
    const schools = await school.findAll();
    return schools;
  } catch (err) {
    console.log(err);
  }
 },
 getSchoolDetail: async (root, { id }) => {
  try {
    const scl = await school.findByPk(id);
    return scl;
  } catch (err) {
    console.log(err);
  }
 },
 getGradeDetails: async () => {
  try {
    const grades = await grade.findAll({});
    return grades;
  } catch (err) {
    console.log(err);
  }
 },
}
 

На детской площадке, когда я спрашиваю, как,

 query {
 getSchoolDetails{
  id
  name
  email
  grades{
    name
  }
 }
}
 

Вывод для этого таков,

 {
 "data": {
   "getSchoolDetails": [
    {
      "id": "1",
      "name": "Rotary West School",
      "email": "rotary@gmail.com",
      "grades": null
    },
    {
      "id": "2",
      "name": "Excel Public School",
      "email": "excel@gmail.com",
      "grades": null
    },
  ]
}
 

Точно так же, когда я запрошу оценки, я получу школу, как null . Я изучаю отношения nodejs с graphql, пожалуйста, помогите мне решить эту проблему.

Ответ №1:

Вы должны использовать include в своих запросах в resolvers.js файл, как показано ниже

 getSchoolDetails: async () => {
                try {
                    const schools = await school.findAll({
                        include: [{ model: Grade }],
                    });
                    return schools;
                } catch (err) {
                    console.log(err);
                }
            },
 

Это позволит получить все оценки, связанные со школами

И если ты захочешь include school with grade you have to associate grade with school using Grades belongsTo school