node.js - 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);
我的代码有什么问题,我该如何解决?
解决方案
在多对多关系中,您将 RegionExchangeRequests 指定为连接其他两个表的直通表,而在 sequelize 中,您不能在直通表中调用通常的模型方法。为此,您需要创建超级多对多关系,以获取更多信息查看此链接Advanced-associations-in-sequelize
推荐阅读
- twilio - 替换 Twilio Flex 徽标
- javascript - 使用 JavaScript/jQuery 在浏览器中的某个位置显示视觉对象
- f# - F# 关闭 tcp 客户端连接
- ios - Callkit 和 Webrtc 从锁定屏幕接听电话时没有音频
- python - 从数据框中提取数据
- php - 不推荐使用 Wordpress:define():不推荐使用不区分大小写的常量的声明
- eclipse - 如何解决Mac上更改用户名/用户目录名称后无法安装或打开Mac Eclipse
- python - 如何从之前抓取的网址中抓取图像(嵌套网址)
- angular - 错误 TS2339:类型 'y[] 上不存在属性 'x'
- android - 将文件写入 Android Q 中的 getExternalFilesDir() 子目录路径时引发 ENOENT 错误