sequelize include,连接两个关联表

Posted

技术标签:

【中文标题】sequelize include,连接两个关联表【英文标题】:sequelize include, join two associated tables 【发布时间】:2019-06-23 03:59:30 【问题描述】:

我在单独的文件中定义了 2 个模型分配和区域,如下所示:

./models
--Area.js
--Assignment.js
--index.js

Area.js:

const Area = sequelize.define('area', ID: 类型:Sequelize.INTEGER, 自动增量:真, 主键:真 , 姓名: 类型:Sequelize.STRING, , 时间戳:假 ); Area.hasMany(Assignment, foreignKey:'areaId');

Assignment.js:

const 赋值 = sequelize.define('赋值', ID: 类型:Sequelize.INTEGER, 自动增量:真, 主键:真, , 时间戳:假 ); 分配.关联 = 模型 => models.Assignment.belongsTo(models.Area, foreignKey: 'areaId', onDelete: "级联", ); ;

当我尝试使用 Include 属性查找一些带有区域信息(连接)的作业时,我收到一条错误消息:area is not associated to assignment!

赋值.findAll( 包括:[模型:区域] ).then((作业) => res.status(200).json(作业) ).catch((e) => res.status(500).json( 错误: e.message ) )

提前致谢。

【问题讨论】:

【参考方案1】:
Area.hasMany(Assignment,  foreignKey:'areaId');

所以列 areaId 应该在您的Assignment.js 中。但在您的 Assignment 模型中看不到它。

models.Assignment.belongsTo(models.Area, 
            foreignKey: 'areaId',
            onDelete: "CASCADE",
        );

只有当您的Assignment.js 中有一个名为 areaId 的列时,这才是正确的

总之,您错过了Assignment 模型中的areaId 列。

【讨论】:

该列是在我午餐脚本时自动创建的,所以当我检查数据库时,我可以看到 areaId 是自动创建并引用到 Area 表主键(id)。这就是官方文档所说的Sequelize foreign Key Docs提前致谢。 您可以停止表模型文件的同步属性,以便 Sequelize 不会删除并重新创建表。 在创建关系时还有其他选项,例如 - sourceKey 就像 foreignKey 但用于其他表 @BenAyoub 然后尝试将其添加到您的模型中并让我知道会发生什么。 (我的意思是提到模型中的列)【参考方案2】:

在我看来,您缺少封闭的关联方法:

Area.associate = models => 
    models.Area.hasMany(Assignment,  foreignKey:'areaId')
;

areaId 列也应该在您的Assignment.js

【讨论】:

以上是关于sequelize include,连接两个关联表的主要内容,如果未能解决你的问题,请参考以下文章

查询联结表而不在 Sequelize 中获取两个关联

sequelize 是不是可以通过关联表中的属性过滤查询?

跨 Sequelize 关联播种数据

在 sequelize 返回值中删除连接表数据

Mean Stack -> Sequelize Mysql 关联

Sequelize Find belongsToMany 关联