mysql - Sequelize - 多对多关联 - 3 个外键

标签 mysql sequelize.js many-to-many associations

我正在寻求一些有关在 Sequelize 模型中正确定义具有 3 个外键的关联表的帮助:

情况:我正在构建一个电子邮件客户端,此问题的相关模型是:

  • 用户模型(用户记录)
  • 话题模型(每个新电子邮件话题的话题记录)
  • 文件夹模型(默认文件夹的文件夹,例如收件箱、已发送文件夹等以及自定义文件夹)
  • ThreadFolder 模型(将特定 a) User 模型链接到特定 b) Thread 模型到特定 c) < 的关联强>文件夹模型)

问题:我的问题是关联模型/表 (ThreadFolder),我无法为 ThreadFolder 关联模型中的所有 3 个表创建关联。


第一次尝试我能够创建与 Sequelize 的关联,该关联允许 ThreadFolder 模型为上述三个模型中的 2 个(但不是全部 3 个)创建外键。以下是该关联:

Thread.belongsToMany(Folder, { through: ThreadFolder, foreignKey: 'thread_id', otherKey: 'folder_id' })
Folder.belongsToMany(Thread, { through: ThreadFolder, foreignKey: 'folder_id', otherKey: 'thread_id' })

SQL 输入尝试:

  1. 用户 ID:1 |线程 ID: 1 |文件夹 ID:1 |插入成功
  2. 用户 ID:1 |线程 ID: 1 |文件夹 ID:2 |插入成功
  3. 用户 ID:1 | thread_id:2 |文件夹 ID:1 |插入失败 - 以下错误...
  4. 用户 ID:2 |线程 ID: 1 |文件夹 ID:1 |插入成功
  5. 用户 ID:2 |线程 ID: 1 |文件夹 ID:2 |插入成功

第一次尝试的错误:

Executing:
INSERT INTO `iwantmail-core`.`thread_folders` (`user_id`, `deleted`, `archived`, `created_at`, `updated_at`, `thread_id`, `folder_id`) VALUES ('1', '0', '0', '2020-03-05 23:34:16', '2020-03-05 23:34:16', '30', '1');

Operation failed: There was an error while applying the SQL script to the database.
ERROR 1062: 1062: Duplicate entry '30-1' for key 'PRIMARY'
SQL Statement:
INSERT INTO `iwantmail-core`.`thread_folders` (`user_id`, `deleted`, `archived`, `created_at`, `updated_at`, `thread_id`, `folder_id`) VALUES ('1', '0', '0', '2020-03-05 23:34:16', '2020-03-05 23:34:16', '30', '1')

第二次尝试我可以指定如下所示的关联,以允许我添加具有不同 user_id 和folder_id 的记录,但是,如果我使用不同的 thread_id,则会收到如下所示的错误。

Folder.hasMany(ThreadFolder, { foreignKey: 'folder_id' })
ThreadFolder.belongsTo(Folder, { foreignKey: 'folder_id' })
Thread.belongsToMany(Folder, { through: ThreadFolder })

Thread.hasMany(ThreadFolder, { foreignKey: 'thread_id' })
ThreadFolder.belongsTo(Thread, { foreignKey: 'thread_id' })

User.hasMany(ThreadFolder, { foreignKey: 'user_id' })
ThreadFolder.belongsTo(User, { foreignKey: 'user_id' })
Folder.belongsToMany(User, { through: ThreadFolder })

SQL 输入尝试:

  1. 用户 ID:1 |线程 ID: 1 |文件夹 ID:1 |插入成功
  2. 用户 ID:1 |线程 ID: 1 |文件夹 ID:2 |插入成功
  3. 用户 ID:1 | thread_id:2 |文件夹 ID:1 |插入失败 - 以下错误...
  4. 用户 ID:2 |线程 ID: 1 |文件夹 ID:1 |插入成功
  5. 用户 ID:2 |线程 ID: 1 |文件夹 ID:2 |插入成功

第二次尝试的错误

Operation failed: There was an error while applying the SQL script to the database.
ERROR 1062: 1062: Duplicate entry '1-1' for key 'PRIMARY'
SQL Statement:
INSERT INTO `mail-core`.`thread_folders` (`user_id`, `thread_id`, `folder_id`) VALUES ('1', '2', '1')

请注意,我基本上试图指示 Thread#1 的 User#1 位于文件夹#1 中,一旦我尝试指示 Thread#2 的 User#1 位于文件夹#1 中,就会出现上述错误发生。


帮助:

  • 有人可以给我指出正确的方向/说明应该如何编写关联以考虑到第三个关联吗?
  • 是否有不同的方式来编写此关联,以便在关联表中考虑所有 3 个外键?

感谢您提前提供的任何帮助/帮助!

(使用的相关技术:MySQL、MySQL Workbench、Node 12.x、TypeScript、Serverless Framework)

编辑:对帖子进行了编辑,第二次尝试作为部分解决方案提出,经过进一步测试,当第二个用户添加到关联表 ThreadFolder 中的同一线程和文件夹时,第一次和第二次尝试都会失败。

最佳答案

查看您的创建语句后,我认为您已经定义了关联 thread_folders适本地。在我看来,您对定义关联的第二次尝试是正确的。

插入记录时出现错误,因为您的主键是两个属性的组合键,即 thread_idfolder_id 。让我们说在您的 thread_folders 中表中已有 thread_id 的记录1 和 folder_id 1 那么你不能用 thread_id 插入另一条记录1 和 folder_id 1.

如果删除 thread_id 的组合主键和folder_id然后您就可以在thread_folders中插入您想要插入的记录表。

希望对您有帮助!

关于mysql - Sequelize - 多对多关联 - 3 个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60552715/

相关文章:

php - mysql之间的问题

具有任务依赖性的任务管理器应用程序的 MySQL 表结构

node.js - Sequelize - 加入多列

many-to-many - 非 ID 属性的 Sequelize 多对多

Mysql 不返回插入行的正确 id

mysql - 使用 JDBC 检索 latin1 编码的结果

sequelize.js - Sequelize v6 从目录下的文件加载模型

sequelize.js - 使用sql server时对upsert进行sequelize

php - 多对多(belongsToMany)Laravel 关系在 HHVM 下似乎不起作用

Django:prefetch_相关结果按中间表的字段排序