Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用Sequelize创建关联实体?_Node.js_Sequelize.js - Fatal编程技术网

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"
});