首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >续订-联想多到多-3外国钥匙

续订-联想多到多-3外国钥匙
EN

Stack Overflow用户
提问于 2020-03-05 19:30:06
回答 2查看 785关注 0票数 2

我正在寻找一些帮助,以便在后缀模型中正确定义带有3个外键的关联表:

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

  • User模型(用户records)
  • Thread模型(每个新的email-thread)
  • Folder模型的线程记录(默认文件夹的文件夹,例如收件箱、发送等)和自定义folders)
  • ThreadFolder模型(关联链接特定的a) 用户模型,到特定的b) 线程模型,到特定的c) 文件夹模型)

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

第一次尝试--我能够创建一个带有Sequelize的关联,允许ThreadFolder模型为上述三个模型中的两个创建外键,但不是全部。

代码语言:javascript
复制
Thread.belongsToMany(Folder, { through: ThreadFolder, foreignKey: 'thread_id', otherKey: 'folder_id' })
Folder.belongsToMany(Thread, { through: ThreadFolder, foreignKey: 'folder_id', otherKey: 'thread_id' })

SQL输入尝试:

Insert

  • user_id:

  • user_id:1欧元(Thread_id):1欧元(Thread_id):1欧元(Thread_id):1成功的Insert

  • user_id: 1 thread_id: 1欧元(Folder_id):2成功的Insert (成功的);thread_id:2(Thread_id):2 folder_id: 1回(失败)插入-错误的below...

  • user_id: 2,成功的Insert

  • user_id:2,folder_id: 1回环成功的Insert

  • user_id:2 thread_id: 1回环:成功插入en19 20#en19 20#

第一次尝试的错误:

代码语言:javascript
复制
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,则会得到如下所示的错误。

代码语言:javascript
复制
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

  • user_id:

  • user_id:1欧元(Thread_id):1欧元(Thread_id):1欧元(Thread_id):1成功的Insert

  • user_id: 1 thread_id: 1欧元(Folder_id):2成功的Insert (成功的);thread_id:2(Thread_id):2 folder_id: 1回(失败)插入-错误的below...

  • user_id: 2,成功的Insert

  • user_id:2,folder_id: 1回环成功的Insert

  • user_id:2 thread_id: 1回环:成功插入en19 20#en19 20#

第二次尝试的错误

代码语言:javascript
复制
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?

  • Is,,
  • ,请给我指出正确的方向/说明应该如何写这个关联,以考虑到第三种关联,有一种不同的方式将这个关联写在一起,以便在关联表中考虑所有的3个外键?

谢谢您的帮助和帮助!

(使用的相关技术: MySQL、MySQL工作台、Node12.x、TypeScript、Serverless框架)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-09 03:04:08

工作解决方案最终导致了第二次尝试的差异:

代码语言:javascript
复制
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' })

我的大多数模型调用(基于它们之前是如何编写的)最终会更改为首先从关联表开始。

代码语言:javascript
复制
 ThreadFolder.findAll({
        where: {
            user_id: 1,
            folder_id: 1,
        },
        include: [
            {
                model: Thread,
                include: [
                    'recipient',
                    'sender'
                ]
            }
        ]
    })

希望这有助于其他已经尝试做多外键关联表超过2个外键,假定这种方法应该与任何数量的外键在关联表中。

票数 1
EN

Stack Overflow用户

发布于 2020-03-07 07:22:36

在查看您的create语句之后,我认为您已经正确地定义了关联thread_folders。在我看来,你第二次尝试定义联想是正确的。

插入记录时出错,因为主键是两个属性(即thread_idfolder_id )的组合键。假设在您的thread_folders表中已经有thread_id 1和folder_id 1的记录,那么您就不能用thread_id 1和folder_id 1插入另一条记录。

如果删除thread_idfolder_id的组合主键,则可以在thread_folders表中插入要插入的记录。

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60552715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档