Node.js - 如何使用 graphql 获取关联的模型数据?

Posted

技术标签:

【中文标题】Node.js - 如何使用 graphql 获取关联的模型数据?【英文标题】:Node.js - How to get associated model data using graphql? 【发布时间】:2021-11-27 10:49:29 【问题描述】:

在 Node.js 应用程序中,我使用 graphql 来获取数据列表。我创建了两个模型,称为SchoolGrade。像 School 这样的模型的关联有很多 Grades 并且 Grade 属于 School。 查询时,我得到 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】:

您必须在 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

【讨论】:

以上是关于Node.js - 如何使用 graphql 获取关联的模型数据?的主要内容,如果未能解决你的问题,请参考以下文章

graphql prisma node js postgresql如何将创建日期/更新字段添加到graphql类型?

GraphQL 如何在 node.js 中将服务器错误与客户端错误(最好使用 TryCatch 块)分开?

如何从需要 return 语句的 GraphQL 解析器中调用异步 node.js 函数?

在 Gatsby-node.js 中检索多种数据类型时,graphql 重复文档错误

如何从 Node.js/Express 服务器调用 GraphQL API?

将数据从服务器(Node.js)发送到 GraphQL 服务器中的客户端(React 组件)