解决 "IS A" 与 graphql-sequelize 的关系
Resolve "IS A" relationship with graphql-sequelize
我正在使用 graphql
, sequelize
and graphql-sequelize
, and I'm having some troubles to resolve a "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]
}
})
});
在模式字段(users
和 patients
)上调用 resolver
方法工作正常,但我的问题是如何在 patientType
中调用解析器给 return 它的用户,因为我没有关联 属性.
谢谢。
正如 mickhansen 在此 issue 中提到的,所有 sequelize 关联调用 return 关联引用。
我存储了来自 belongsTo
的引用 return,如上所示:
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)
}
}
});
我正在使用 graphql
, sequelize
and graphql-sequelize
, and I'm having some troubles to resolve a "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]
}
})
});
在模式字段(users
和 patients
)上调用 resolver
方法工作正常,但我的问题是如何在 patientType
中调用解析器给 return 它的用户,因为我没有关联 属性.
谢谢。
正如 mickhansen 在此 issue 中提到的,所有 sequelize 关联调用 return 关联引用。
我存储了来自 belongsTo
的引用 return,如上所示:
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)
}
}
});