首页 > 解决方案 > 如何使用 Sequelize.js 将数据插入到桥接/映射表中

问题描述

我正在尝试使用 sequelize.js 将数据插入到桥接/映射表中

我将文章定义为-

const Articles = db.define('article', {
    "slug": {
      type: Sequelize.STRING,
      primaryKey: true,
      allowNull:false
    },
    "title": {
      type: Sequelize.STRING(50),
      allowNull: false
    },
    "description": {
      type: Sequelize.STRING(100),
    },
    "body": Sequelize.STRING,
  })

并标记为-

const Tags = db.define('tag', {
    name: {
      type: Sequelize.STRING,
      primaryKey: true
    }
})

我在它们之间创建了一个多对多的关联

Articles.belongsToMany(Tags, {through:'article_tags'})
Tags.belongsToMany(Articles, {through:'article_tags'})

这在我的数据库中创建了一个表 article_tags 以及文章和标签。但是现在如何使用 sequelize 将数据插入到这个 article_tags 桥接表中?

标签: javascriptsqlormmappingsequelize.js

解决方案


您还必须对该映射表进行建模....然后,当您在解析器中说出“tagArticle”之类的内容时,您只需使用文章的 ID 和标签的 ID 调用映射表上的 create 函数...这是我将经销商加入帐户的连接表的解析器示例

createUserAccountDealer: async (_, args, { models }) => {

      let returnValue = null;
      const { username, input } = args;
      try {
        returnValue = await models.ProfileDealerInfo.create(input);

        if (returnValue && returnValue.dataValues.id) {
          const tempJoin = { username, dealer_id: returnValue.dataValues.id };
          await models.ProfileAccountDealer.create(tempJoin);
        }
      } catch (err) {
        logger.error(err);
      }
      return returnValue;
    }

对我而言,不同之处在于经销商是帐户的孩子,所以我在创建子经销商记录后立即进行加入记录...您的示例有点不同,其中标签和文章可能已经存在,您可能只是将它们关联起来这意味着 id 只会从客户端传递到 args 中,并且您不会有等待从子记录创建中取回 id 的额外步骤


推荐阅读