Sequelize 关联 hasOne,belongsTo
Posted
技术标签:
【中文标题】Sequelize 关联 hasOne,belongsTo【英文标题】:Sequelize associations hasOne, belongsTo 【发布时间】:2013-10-05 05:30:13 【问题描述】:问题是我无法使用关系 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 );
);
【问题讨论】:
【参考方案1】:谢谢你的回答,对我帮助很大。您还可以使用类方法直接在模型中添加关系。我在下面添加了一个示例,希望对您有所帮助!
用户模型(文件)
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
)
【讨论】:
很好的例子!简单实用。 点赞!您是否必须同时添加 user.hasMany 和 Comments.belongsTo 或其中之一就足够了?如果有,那是哪一个?【参考方案2】:我很确定错误出在您的关联中。从您描述表结构的方式来看,关联应该如下所示:
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
。 customer -> statetype 的关系是“反向关联”,这意味着外键在 customer 表中。为此,您需要belongsTo
【讨论】:
以上是关于Sequelize 关联 hasOne,belongsTo的主要内容,如果未能解决你的问题,请参考以下文章
Sequelize ORM中HasOne和BelongsTo的区别