我有以下四种型号
用户
user_id
user_email
许可证
permit_id
permit_name
标签
label_id
label_name
module_name (user or permit)
模块标签
module_label_id
label_id **(fk - Label table)**
module_id (user_id or permit_id)
如何在使用 sequelize 获取许可数据时获取映射的标签详细信息?
选择“from” Permit,加入 ModuleLabel where module_id=permit_id && module_name = 'permit'(from Label table),然后从那里加入Label
最佳答案
它可以完成,但绝对没有数据库中的限制。在你的情况下 module_id
ModuleLabel
中的字段可引用user
或 permit
table 。我可以向您展示一些实现草图,但是我建议重建架构,例如创建 UserLabel
和 PermitLabel
对 User
有外键约束的模型和 Permit
.但是,以下是您可以按照自己的方式进行操作的方法
// in User model definition
classMethods: {
associate: function(models){
this.hasMany(models.ModuleLabel, { foreignKey: 'module_id', constraints: false });
}
}
// in Permit model definition
classMethods: {
associate: function(models){
this.hasMany(models.ModuleLabel, { foreignKey: 'module_id', constraints: false });
}
}
以上协会允许我们加入
ModuleLabel
查询两个 User
时的模型或 Permit
.最重要的部分是记住 constraints: false
这可以防止创建数据库约束。让我们继续前进。 Label
模型不需要任何关联,只需要字段声明。最后一个型号是ModuleLabel
// in ModuleLabel model definition
classMethods: {
associate: function(models){
this.belongsTo(models.Label, { foreignKey: 'label_id' });
this.belongsTo(models.User, { foreignKey: 'module_id', constraints: false });
this.belongsTo(models.Permit, { foreignKey: 'module_id', constraints: false });
}
}
现在,为了执行您想要的查询,您可以这样做
models.Permit.findAll({
include: [
{
model: models.ModuleLabel,
include: [
{
model: models.Label,
where: { module_name: 'permit' }
}
]
}
]
}).then((result) => {
console.log(result);
});
上面的查询将生成类似于下面介绍的 SQL
SELECT * FROM Permits
LEFT OUTER JOIN ModuleLabels
ON Permits.id = ModuleLabels.module_id
INNER JOIN Labels
ON ModuleLabels.label_id = Labels.id
AND Label.module_name = 'permit';
关于node.js - Sequelize 关联: same field with multiple table is possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42546722/