2016-04-06 41 views
2

我正在使用graphqlsequelizegraphql-sequelize,我在解決"IS A"關係時遇到了一些麻煩。解決「IS A」與graphql-sequelize的關係

我sequelize模型如下:

// 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] 
    } 
    }) 
}); 

調用resolver方法上的架構(userspatients)領域的工作正常,但我的問題是如何調用patientType中的解析器來返回其用戶,因爲我沒有關聯屬性。

謝謝。

回答

0

正如mickhansen在這個issue中提到的那樣,所有的後續關聯調用都會返回一個關聯引用。

我存儲在參考從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) 
     } 
    } 
});