Node.js 如何使用Sequelize创建关联实体?
我有两个表和第三个关联实体表,如下所示: 书籍:Node.js 如何使用Sequelize创建关联实体?,node.js,sequelize.js,Node.js,Sequelize.js,我有两个表和第三个关联实体表,如下所示: 书籍: module.exports = (sequelize, DataTypes) => { const Book = sequelize.define( "Book", { title: DataTypes.STRING, author: DataTypes.STRING, }, {} ); Book.associate = function
module.exports = (sequelize, DataTypes) => {
const Book = sequelize.define(
"Book",
{
title: DataTypes.STRING,
author: DataTypes.STRING,
},
{}
);
Book.associate = function (models) {
Book.belongsToMany(models.Language, {
as: "BookLanguages",
through: "BookLanguages",
foreignKey: "bookId",
});
};
return Book;
};
语言:
module.exports = (sequelize, DataTypes) => {
const Language = sequelize.define(
"Language",
{
name: DataTypes.STRING,
},
{}
);
Language.associate = function (models) {
Language.hasMany(models.Book, {
as: "BookLanguages",
through: "BookLanguages",
foreignKey: "languageId",
});
};
return Language;
};
语言包含以下记录:1。英语,2。法语的
我想写一本英文和法文的新书
图书管理员:
const Sequelize = require("sequelize");
const db = require("../../models/index");
const Book = db.Book;
const Language = db.Language;
exports.createBook = (req, res) => {
Book.create({
title: req.body.title,
author: req.body.author,
BookLanguages: req.body.languages // an array [1, 2]
}, {
include: [ { association: Language, as: "BookLanguages" } ]
})
.then((book) => {
res.json({ status: 200, message: "Book created successfully!" });
})
.catch((err) => {
res.json({ status: 400, message: err });
});
};
根据Sequelize文档,这应该足够了,但我得到一个错误:
TypeError:无法读取未定义的属性“name”
有人能看到我在设置这些关联/关联实体时遗漏了什么,或者我可能误解了什么吗?必须在模型中指定主键,m:N才能工作 {type:DataTypes.STRING,primaryKey:true} 联想 M:N(belongsToMany)将始终使用主键外键只是PK的别名,所以它可以。但是,由于您为一个模型别名,因此您必须使用“otherKey”告诉sequelize与另一个模型关联的键是什么
嗯,这看起来很有希望,但我仍然得到相同的类型错误。我注意到,如果我将控制器的include中的别名更改为不正确的内容,我仍然会得到错误,这使我认为我的别名是错误的。您的
BookLanguages
表不需要id列。在直通表上,主键实际上是由两个外键ID组成的复合主键。您是否在图书和语言之间进行循环导入?您可能需要在单独的模块中进行关联。@Glenn谢谢,我将对此进行研究。复合主键是必需的,还是单独的id仍然可以使用?Sequelize文档包括这样一行:“只要所有元素都是新的,就可以通过嵌套关联一步创建实例。”我怀疑问题在于语言元素不是新创建的-我正在尝试将已经创建的元素链接到一个新的元素(与新书相关的现有语言)。如果有人偶然发现了这一点,我的解决方案是用Laravel重写我的API…可能对很多人没有用处,但我就是这么做的!
Language.belongsToMany(models.Book, {
as: "BookLanguages",
through: "BookLanguages",
foreignKey: "languageId",
otherKey : "bookId"
});
Book.belongsToMany(models.Language, {
as: "BookLanguages",
through: "BookLanguages",
foreignKey: "bookId",
otherKey : "languageId"
});