首页 > 解决方案 > 用重复的外键序列化多对多关系

问题描述

假设我有以下表格:

Messages:
+----+----------------------------------------------------------------+
| id |                            content                             |
+----+----------------------------------------------------------------+
|  1 | Please call 111-111-1111. I repeat: CAN YOU CALL 111-111-1111? |
|  2 | My number is 111-111-1111.                                     |
|  3 | Please call me at either 222-222-2222 or 333-333-3333          |
+----+----------------------------------------------------------------+
PhoneNumbers:
+----+--------------+------------------+
| id |    number    |     provider     |
+----+--------------+------------------+
|  1 | 111-111-1111 | AT&T             |
|  2 | 222-222-2222 | Deutsche Telekom |
|  3 | 333-333-3333 | Verizon          |
+----+--------------+------------------+

现在我想创建一个表来表示消息中每次出现的电话号码:

PhoneNumberOccurrences:
+----+-----------+---------------+
| id | MessageId | PhoneNumberId |
+----+-----------+---------------+
|  1 |         1 |             1 |
|  2 |         1 |             1 |
|  3 |         2 |             1 |
|  4 |         3 |             2 |
|  5 |         3 |             3 |
+----+-----------+---------------+

下面是定义这个表的代码:

const Occurence = sequelize.define("PhoneNumberOcurrence", {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
  },
});
PhoneNumber.belongsToMany(Message, { through: Occurence });
Message.belongsToMany(PhoneNumber, { through: Occurence });

但是,如果我尝试填充表格的前两行:

const message = await Message.findOne({ where: { id: 1 } });
const number = await PhoneNumber.findOne({ where: { id: 1 } });
await message.addPhoneNumber(number);
await message.addPhoneNumber(number);

第一行成功插入,但第二行没有。我的猜测是因为重复的外键。即使外键重复,我如何插入?

标签: javascriptsqlnode.jssequelize.js

解决方案


推荐阅读