【问题标题】:Resolve "IS A" relationship with graphql-sequelize用 graphql-sequelize 解决“IS A”关系
【发布时间】:2016-07-26 06:36:06
【问题描述】:

我正在使用 graphqlsequelizegraphql-sequelize,但在解决 "IS A" 关系时遇到了一些麻烦。

我的续集模型如下:

// models.js

// User table
let User = sequelize.define('user', {
    id: Sequelize.INTEGER
    name: Sequelize.STRING
});

// Patient table
let Patient = sequelize.define('patient', {
    bloodType: Sequelize.STRING
});
// Defines "IS A" relationship: [Patient] IS A [User]
Patient.belongsTo(models.User, {
    foreignKey: {
      name: 'id',
      type: DataTypes.INTEGER,
      primaryKey: true
    },
    foreignKeyConstraint: true
})

// Doctor table
let Doctor = sequelize.define('doctor', {
  registry: Sequelize.STRING
});
// Defines "IS A" relationship: [Doctor] IS A [User]
Doctor.belongsTo(models.User, {
    foreignKey: {
      name: 'id',
      type: DataTypes.INTEGER,
      primaryKey: true
    },
    foreignKeyConstraint: true
})

这是我的 graphql 架构:

// graphql.js
import resolver from 'graphql-sequelize';
import * as models from './models';

let userType = new GraphQLObjectType({
    name: 'User',
    fields: {
        id: { type: new GraphQLNonNull(GraphQLInt) },
        name: { type: GraphQLString }
    }
});

let patientType = new GraphQLObjectType({
    name: 'Patient',
    fields: {
        id: { type: new GraphQLNonNull(GraphQLInt) },
        bloodType: { type: GraphQLString },
        user: {
            type: new GraphQLNonNull(userType),
            // IMPORTANT!
            // How can I call resolver if I don't have a assotiation property like Patient.User?
            resolve: resolver()
        }
    }
});

// [doctorType omitted]

let schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: 'Query',
    fields: {
        users: {
            type: userType,
            resolve: resolver(models.User)
        },
        patients: {
            type: patientType,
            resolve: resolver(models.Patient)
        }
        // [doctor field omitted]
    }
  })
});

在架构字段(userspatients)上调用 resolver 方法可以正常工作,但我的问题是如何在 patientType 中调用解析器以返回其用户,因为我没有关联属性。

谢谢。

【问题讨论】:

    标签: sequelize.js graphql-js graphql-sequelize


    【解决方案1】:

    正如 mickhansen 在 issue 中提到的,所有 sequelize 关联调用都会返回关联引用。

    我存储了belongsTo返回的引用,如上图:

     models.Patient.User = Patient.belongsTo(models.User, {
        foreignKey: {
          name: 'id',
          type: DataTypes.INTEGER,
          primaryKey: true
        },
        foreignKeyConstraint: true
    })
    

    然后在resolve函数处使用:

    import * as models from '../path/models'
    
    let patientType = new GraphQLObjectType({
        name: 'Patient',
        fields: {
            id: { type: new GraphQLNonNull(GraphQLInt) },
            bloodType: { type: GraphQLString },
            user: {
                type: new GraphQLNonNull(userType),
                resolve: resolver(models.default.Patient.User)
                // alternatively you could the following as sequelize always stores assotiations in associations
                // resolve: resolver(models.default.Patient.associations.User)
            }
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2020-04-16
      • 1970-01-01
      • 2018-02-01
      • 2020-12-04
      • 1970-01-01
      • 2023-02-20
      • 2021-06-22
      • 2018-09-01
      相关资源
      最近更新 更多