2016-04-06 5 views
2

Ich verwende graphql, sequelize und graphql-sequelize, und ich habe einige Probleme, um eine "IS A" Beziehung zu lösen.Resolve "IS A" Beziehung mit graphql-sequelize

Meine sequelize Modelle sind die folgenden:

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

Und das ist mein graphql Schema:

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

Aufruf der resolver Methode auf den Feldern des Schemas (users und patients) funktioniert gut, aber meine Frage ist, wie Resolver in patientType aufrufen, um seinen Benutzer zurückgeben, da ich keine Assoziationseigenschaft habe.

Danke.

Antwort

0

Wie von mickhansen unter issue erwähnt, geben alle Sequelize-Assoziationsaufrufe eine Assoziationsreferenz zurück.

I die Referenz von belongsTo zurückgegeben gespeichert sind, wie oben gezeigt:

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

und verwendete sie dann an der resolve Funktion:

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