node.js - Sequelize 关联: same field with multiple table is possible?

标签 node.js sequelize.js

我有以下四种型号

用户

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 中的字段可引用userpermit table 。我可以向您展示一些实现草图,但是我建议重建架构,例如创建 UserLabelPermitLabelUser 有外键约束的模型和 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/

相关文章:

node.js - 为什么字符串的utf8编码返回的字符串没有变化

node.js - Mongodb 找到最佳匹配

node.js - 继承嵌套关系, "posts"有多个 "authors"?

sequelize.js - Sequelize : how to set PK of join table as pair of foreign keys to be able to use save() on the join table instance without triggering 'no PK error' ?

node.js - 在子数组上使用 "where"和 "in"时出现 Sequelize 错误

sequelize.js - 在 sequelize 中播种数据后,关联停止工作

mysql - 确定如何检索结果集数据(node.js + sequelize + 外键mysql)

mysql - 没有回调的nodejs mysql

node.js - Nodejs中的mqtt文件传输? (使用 mqtt.js)

node.js - 快速中间件重定向不起作用