我正在寻找一些帮助,以便在后缀模型中正确定义带有3个外键的关联表:
情景:我正在构建一个电子邮件客户端,与此问题相关的模型如下:
问题:我的问题是关联模型/表( ThreadFolder ),我无法为ThreadFolder关联模型中的所有3个表创建关联。
第一次尝试--我能够创建一个带有Sequelize的关联,允许ThreadFolder模型为上述三个模型中的两个创建外键,但不是全部。
Thread.belongsToMany(Folder, { through: ThreadFolder, foreignKey: 'thread_id', otherKey: 'folder_id' })
Folder.belongsToMany(Thread, { through: ThreadFolder, foreignKey: 'folder_id', otherKey: 'thread_id' })SQL输入尝试:
Insert
第一次尝试的错误:
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输入尝试:
Insert
第二次尝试的错误
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')请注意,我基本上是试图指示User#1 of Thread#1在Folder#1中,并且当我试图指示User#1 of Thread#2在Folder#1中时,就会发生上述错误。
帮助:
association?
。
谢谢您的帮助和帮助!
(使用的相关技术: MySQL、MySQL工作台、Node12.x、TypeScript、Serverless框架)
编辑:对post进行编辑,第二次尝试作为部分解决方案出现,经过进一步测试,当第二个用户被添加到关联表ThreadFolder中的同一个线程和文件夹时,第一次和第二次尝试都会失败。
发布于 2020-03-09 03:04:08
工作解决方案最终导致了第二次尝试的差异:
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' })我的大多数模型调用(基于它们之前是如何编写的)最终会更改为首先从关联表开始。
ThreadFolder.findAll({
where: {
user_id: 1,
folder_id: 1,
},
include: [
{
model: Thread,
include: [
'recipient',
'sender'
]
}
]
})希望这有助于其他已经尝试做多外键关联表超过2个外键,假定这种方法应该与任何数量的外键在关联表中。
发布于 2020-03-07 07:22:36
在查看您的create语句之后,我认为您已经正确地定义了关联thread_folders。在我看来,你第二次尝试定义联想是正确的。
插入记录时出错,因为主键是两个属性(即thread_id和folder_id )的组合键。假设在您的thread_folders表中已经有thread_id 1和folder_id 1的记录,那么您就不能用thread_id 1和folder_id 1插入另一条记录。
如果删除thread_id和folder_id的组合主键,则可以在thread_folders表中插入要插入的记录。
希望能帮上忙!
https://stackoverflow.com/questions/60552715
复制相似问题