首页 > 解决方案 > Node JS Sequelize多对多关系抛出错误列id不存在

问题描述

我正在构建一个 Node JS Web 应用程序。我正在使用 Sequelize,https: //sequelize.org/来操作数据库逻辑。现在,我遇到了批量插入和多对多关系的问题。

我有一个名为 Region 的模型,代码如下。

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Region extends Model {
   
    static associate(models) {
      // define association here
      Region.belongsToMany(models.ExchangeRequest, {
        through: 'RegionExchangeRequests',
        as: 'exchangeRequests',
        foreignKey: "region_id",
        otherKey: "exchange_request_id"
      })
    }
  };
  Region.init({
    name: DataTypes.STRING,
    latitude: DataTypes.FLOAT,
    longitude: DataTypes.FLOAT
  }, {
    sequelize,
    modelName: 'Region',
  });
  return Region;
};

然后,我有一个名为 ExchangeRequest 的模型,代码如下。

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class ExchangeRequest extends Model {

    static associate(models) {
      // define association here
      ExchangeRequest.belongsToMany(models.Region, {
        through: 'RegionExchangeRequests',
        as: 'regions',
        foreignKey: 'exchange_request_id',
        otherKey: "region_id"
      })

      ExchangeRequest.belongsTo(models.User, { foreignKey: 'userId', as: 'user', onDelete: 'cascade' });
    }
  };
  ExchangeRequest.init({
    exchange_rate: DataTypes.DECIMAL,
    currency: DataTypes.STRING,
    amount: DataTypes.DECIMAL,
    buy_or_sell: DataTypes.INTEGER,
    note: DataTypes.STRING,
    email: DataTypes.STRING,
    phone: DataTypes.STRING,
    address: DataTypes.STRING,
    userId: DataTypes.INTEGER
  }, {
    sequelize,
    modelName: 'ExchangeRequest',
  });
  return ExchangeRequest;
};

然后我有带有以下代码的 RegionExchangeRequest。

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class RegionExchangeRequest extends Model {

    static associate(models) {
      // define association here
    }
  };
  RegionExchangeRequest.init({
    region_id: DataTypes.INTEGER,
    exchange_request_id: DataTypes.INTEGER
  }, {
    sequelize,
    modelName: 'RegionExchangeRequest',
  });
  return RegionExchangeRequest;
};

我有一个在 RegionExchangeReques 上进行批量插入的函数,如下所示。

const create = async ({
  exchange_rate,
  currency,
  amount,
  buy_or_sell,
  note,
  email,
  phone,
  address,
  region_ids,
  userId
}) => {
  try {
    let exchangeRequest = await ExchangeRequest.create({
      exchange_rate,
      currency,
      amount,
      buy_or_sell,
      note,
      email,
      phone,
      address,
      userId
    });

    if (region_ids && region_ids.length > 0) {
      let pivotData = [ ];
      region_ids.forEach(regionId => {
          pivotData.push({
            exchange_request_id: exchangeRequest.id,
            region_id: regionId
          })
      })
      let regionExchangeRequests = await RegionExchangeRequest.bulkCreate(pivotData);
    }

    return {
      error: false,
      data: exchangeRequest
    }
  } catch (e) {
    return {
      error: true,
      code: 500,
      message: e.message
    }
  }
}

调用该函数时,它会引发以下错误。

"column \"id\" of relation \"RegionExchangeRequests\" does not exist"

以下行引发错误。

let regionExchangeRequests = await RegionExchangeRequest.bulkCreate(pivotData);

我的代码有什么问题,我该如何解决?

标签: node.jssequelize.js

解决方案


在多对多关系中,您将 RegionExchangeRequests 指定为连接其他两个表的直通表,而在 sequelize 中,您不能在直通表中调用通常的模型方法。为此,您需要创建超级多对多关系,以获取更多信息查看此链接Advanced-associations-in-sequelize


推荐阅读