Sequelize - 关联多对多 - 3 个外键
Sequelize - Association Many to Many - 3 Foreign Keys
我正在寻求一些帮助,以在 Sequelize 模型中正确定义具有 3 个外键的关联 table:
情况:我正在构建一个电子邮件客户端,该问题的相关模型是:
- 用户模型(用户记录)
- 线程 模型(每个新电子邮件线程的线程记录)
- 文件夹 模型(默认文件夹的文件夹,例如收件箱、已发送等和自定义文件夹)
- ThreadFolder模型(关联链接到具体a)User模型,到具体b)Thread模型,到特定的c)文件夹模型)
问题: 我的问题是关联 model/table (ThreadFolder),我无法为所有 3 个 table 创建关联ThreadFolder 关联模型。
第一次尝试 我能够创建与 Sequelize 的关联,允许 ThreadFolder 模型为上述三个模型中的两个创建外键,但不是全部 3 个。这里是协会:
Thread.belongsToMany(Folder, { through: ThreadFolder, foreignKey: 'thread_id', otherKey: 'folder_id' })
Folder.belongsToMany(Thread, { through: ThreadFolder, foreignKey: 'folder_id', otherKey: 'thread_id' })
SQL 输入尝试次数:
- user_id:1 | thread_id: 1 | folder_id:1 |插入成功
- user_id:1 | thread_id: 1 | folder_id:2 |插入成功
- user_id:1 | thread_id: 2 | folder_id:1 |插入失败 -- 以下错误...
- user_id: 2 | thread_id: 1 | folder_id:1 |插入成功
- user_id: 2 | thread_id: 1 | folder_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 输入尝试次数:
- user_id:1 | thread_id: 1 | folder_id:1 |插入成功
- user_id:1 | thread_id: 1 | folder_id:2 |插入成功
- user_id:1 | thread_id: 2 | folder_id:1 |插入失败 -- 以下错误...
- user_id: 2 | thread_id: 1 | folder_id:1 |插入成功
- user_id: 2 | thread_id: 1 | folder_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 在 Folder#1 中,一旦我尝试指示 Thread#2 的 User#1 在 Folder#1 中,出现以上错误。
求助:
- 有人能给我指出正确的方向/说明应该如何编写关联以考虑到第三个关联吗?
- 是否有不同的方式将这个关联写在一起,以便在关联中考虑所有 3 个外键 table?
提前感谢任何help/assistance!
(使用的相关技术:MySQL、MySQL Workbench、Node 12.x、TypeScript、Serverless Framework)
编辑:对 post 进行了编辑,第二次尝试作为部分解决方案提出,经过进一步测试,当第二个用户添加到同一线程和文件夹时,第一次和第二次尝试均失败关联 table 线程文件夹。
在查看您的创建语句后,我认为您已经正确定义了关联 thread_folders
。在我看来,您第二次尝试定义关联是正确的。
您在插入记录时出错,因为您的主键是两个属性的组合键,即 thread_id
和 folder_id
。假设在您的 thread_folders
table 中已经有 thread_id
1 和 folder_id
1 的记录,那么您不能插入另一条 thread_id
1 和 folder_id
1.
如果删除 thread_id
和 folder_id
的组合主键,那么您将能够在 thread_folders
table 中插入要插入的记录.
希望对您有所帮助!
工作解决方案最终成为第二次尝试的变体:
User.hasMany(ThreadFolder, { foreignKey: 'user_id' })
ThreadFolder.belongsTo(User, { foreignKey: 'user_id' })
Folder.hasMany(ThreadFolder, { foreignKey: 'folder_id' })
ThreadFolder.belongsTo(Folder, { foreignKey: 'folder_id' })
Thread.hasMany(ThreadFolder, { foreignKey: 'thread_id' })
ThreadFolder.belongsTo(Thread, { foreignKey: 'thread_id' })
我的大部分模型调用(基于它们之前的编写方式)最终将更改为首先从关联 table 开始,例如
ThreadFolder.findAll({
where: {
user_id: 1,
folder_id: 1,
},
include: [
{
model: Thread,
include: [
'recipient',
'sender'
]
}
]
})
希望这可以帮助其他尝试进行多外键关联 table 超过 2 个外键的人,推测这种方法应该适用于关联中任意数量的外键 table。
我正在寻求一些帮助,以在 Sequelize 模型中正确定义具有 3 个外键的关联 table:
情况:我正在构建一个电子邮件客户端,该问题的相关模型是:
- 用户模型(用户记录)
- 线程 模型(每个新电子邮件线程的线程记录)
- 文件夹 模型(默认文件夹的文件夹,例如收件箱、已发送等和自定义文件夹)
- ThreadFolder模型(关联链接到具体a)User模型,到具体b)Thread模型,到特定的c)文件夹模型)
问题: 我的问题是关联 model/table (ThreadFolder),我无法为所有 3 个 table 创建关联ThreadFolder 关联模型。
第一次尝试 我能够创建与 Sequelize 的关联,允许 ThreadFolder 模型为上述三个模型中的两个创建外键,但不是全部 3 个。这里是协会:
Thread.belongsToMany(Folder, { through: ThreadFolder, foreignKey: 'thread_id', otherKey: 'folder_id' })
Folder.belongsToMany(Thread, { through: ThreadFolder, foreignKey: 'folder_id', otherKey: 'thread_id' })
SQL 输入尝试次数:
- user_id:1 | thread_id: 1 | folder_id:1 |插入成功
- user_id:1 | thread_id: 1 | folder_id:2 |插入成功
- user_id:1 | thread_id: 2 | folder_id:1 |插入失败 -- 以下错误...
- user_id: 2 | thread_id: 1 | folder_id:1 |插入成功
- user_id: 2 | thread_id: 1 | folder_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 输入尝试次数:
- user_id:1 | thread_id: 1 | folder_id:1 |插入成功
- user_id:1 | thread_id: 1 | folder_id:2 |插入成功
- user_id:1 | thread_id: 2 | folder_id:1 |插入失败 -- 以下错误...
- user_id: 2 | thread_id: 1 | folder_id:1 |插入成功
- user_id: 2 | thread_id: 1 | folder_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 在 Folder#1 中,一旦我尝试指示 Thread#2 的 User#1 在 Folder#1 中,出现以上错误。
求助:
- 有人能给我指出正确的方向/说明应该如何编写关联以考虑到第三个关联吗?
- 是否有不同的方式将这个关联写在一起,以便在关联中考虑所有 3 个外键 table?
提前感谢任何help/assistance!
(使用的相关技术:MySQL、MySQL Workbench、Node 12.x、TypeScript、Serverless Framework)
编辑:对 post 进行了编辑,第二次尝试作为部分解决方案提出,经过进一步测试,当第二个用户添加到同一线程和文件夹时,第一次和第二次尝试均失败关联 table 线程文件夹。
在查看您的创建语句后,我认为您已经正确定义了关联 thread_folders
。在我看来,您第二次尝试定义关联是正确的。
您在插入记录时出错,因为您的主键是两个属性的组合键,即 thread_id
和 folder_id
。假设在您的 thread_folders
table 中已经有 thread_id
1 和 folder_id
1 的记录,那么您不能插入另一条 thread_id
1 和 folder_id
1.
如果删除 thread_id
和 folder_id
的组合主键,那么您将能够在 thread_folders
table 中插入要插入的记录.
希望对您有所帮助!
工作解决方案最终成为第二次尝试的变体:
User.hasMany(ThreadFolder, { foreignKey: 'user_id' })
ThreadFolder.belongsTo(User, { foreignKey: 'user_id' })
Folder.hasMany(ThreadFolder, { foreignKey: 'folder_id' })
ThreadFolder.belongsTo(Folder, { foreignKey: 'folder_id' })
Thread.hasMany(ThreadFolder, { foreignKey: 'thread_id' })
ThreadFolder.belongsTo(Thread, { foreignKey: 'thread_id' })
我的大部分模型调用(基于它们之前的编写方式)最终将更改为首先从关联 table 开始,例如
ThreadFolder.findAll({
where: {
user_id: 1,
folder_id: 1,
},
include: [
{
model: Thread,
include: [
'recipient',
'sender'
]
}
]
})
希望这可以帮助其他尝试进行多外键关联 table 超过 2 个外键的人,推测这种方法应该适用于关联中任意数量的外键 table。