问题是我无法使用关系hasOne,它不会急于加载状态类型对象。
所有查询都在现有表格上完成。
以下是客户表,重要的是cst_state_type
字段:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('customer', {
customer: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: true,
validate: {
isNumeric: true
}
},
first_name: {
type: DataTypes.STRING(100),
validate: {
isAlphanumeric: true
}
},
last_name: DataTypes.STRING(100),
identity_code: {
type: DataTypes.STRING(20),
allowNull: true,
validate: {
isNumeric: true
}
},
note: DataTypes.STRING(1000),
birth_date: DataTypes.DATE,
created_by: DataTypes.INTEGER,
updated_by: DataTypes.INTEGER,
cst_type: DataTypes.INTEGER,
cst_state_type: {
type: DataTypes.INTEGER,
}
}, {
tableName: 'customer',
updatedAt: 'updated',
createdAt: 'created',
timestamps: true
});
};
cst_state_type表:
module.exports = function(sequelize, DataTypes) {
return sequelize.define('StateType', {
cst_state_type: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
validate: {
}
},
name: DataTypes.STRING(100),
}, {
tableName: 'cst_state_type',
timestamps: false
});
};
如何描述关系:
global.db.Customer.hasOne(global.db.StateType, {
foreignKey: 'cst_state_type',
as: 'state_type'
});
global.db.StateType.belongsTo(global.db.Customer, {
foreignKey: 'cst_state_type'
});
创建热切的加载查询:
db.Customer.findAll( {
include: [
{ model: db.Address, as: 'addresses' },
{ model: db.StateType, as: 'state_type' }
]
})
.success(function (customers) {
res.json(200, customers);
})
.fail(function (error) {
res.json(500, { msg: error });
});
答案 0 :(得分:20)
感谢您的回答,这对我帮助很大。您还可以使用classmethods直接在模型中添加关系。我在下面添加了一个例子,希望这有帮助!
用户型号(文件)
module.exports = function(sequelize, DataTypes){
var User = sequelize.define(
'User', {
name: {
type: DataTypes.STRING,
allowNull: false
}
},
{
classMethods:{
associate:function(models){
User.hasMany(models.Comment, { foreignKey: 'userId'} );
}
}
}
);
return User;
};
评论模型(文件):
module.exports = function(sequelize, DataTypes){
var Comment = sequelize.define(
'Comment', {
text: {
type: DataTypes.STRING,
allowNull: false
}
},
{
classMethods:{
associate:function(models){
Comment.belongsTo(models.User, { foreignKey:'userId'} );
}
}
}
);
return Comment;
};
你不必设置外键,如果你没有指定外键,sequelize会处理它。
然后在查询中:
models.Comment.find({
where: { id: id },
include: [
models.User
],
limit: 1
})
答案 1 :(得分:3)
我很确定错误是在你的协会的某个地方。从您描述表结构的方式来看,关联应该如下所示:
global.db.Customer.belongsTo(global.db.StateType, {
foreignKey: 'cst_state_type',
as: 'state_type'
});
global.db.StateType.hasMany(global.db.Customer, {
foreignKey: 'cst_state_type'
});
据我所知,可以为许多客户分配相同的状态,因此StateType.hasMany
。来自客户的关系 - > statetype是“反向关联”,表示外键位于customer表中。为此,您需要belongsTo