sequelize (js) 关联多个列与一个表

Posted

技术标签:

【中文标题】sequelize (js) 关联多个列与一个表【英文标题】:sequelize (js) association for multiple columns with one table 【发布时间】:2017-10-27 22:46:34 【问题描述】:

希望你做得很好。

我在使用 sequelizejs 时遇到问题,无论我如何在表之间设置关联,我都无法开始工作。我的问题是,我有一个名为 Results 的表,该表的结构为:

| id (primary) | first_guy_id | second_guy_id | third_guy_id | notes |
|--------------|--------------|---------------|--------------|-------|
|              |              |               |              |       |

这个表连接到Users,有趣的部分来了,表Users有一个简单的结构,像这样

| id (primary) | first | last |
|--------------|-------|------|
|              |       |      |

我想用 sequelize 做的是,得到一个看起来与此类似的结果(之后在 json 中),嵌套连接:


  "id": 17,
  "first_guy_id":  "id": 12, "first": "First .... ,
  "second_guy_id":  "id": 14, "first": "First .... ,
  "third_guy_id":  "id": 19, "first": "First .... ,
  "notes": "notes",

在常规 SQL 中执行 SQL JOIN 很容易,即使每列 (first_guy, second ...) 的所有 id 都不同,但在 sequelize 中达到这样的目标让我完全绝望。

当我以这种方式关联两个表时:

Results.hasOne(User,  as:'first_guy', foreignKey: 'first_guy' );
User.belongsTo(Results,  as: 'first_guy' ); 

实际调用时使用

findOne ...
   include: [
         model: User,
          include: [
            
              model: User,
              as: 'first_ugy',
              where: 
                    'id': sequelize.col('Results.first_guy_id')
              ,
            
          ],
        ,

我收到以下错误:

ER_BAD_FIELD_ERROR: Unknown column 'Results.user_id' in 'field list'

这当然是因为它寻找 user_id 作为外键,连接到表“User”,它认为键应该是 user_id。

我找到这个解决方案的两个问题是:

    如何使用 sequelize 加入任何字段的结果,方法与使用常规 SQL 的方法相同(此处为伪代码)“INNER JOIN User.id on Results.first_guy_id as MY_FIELD_NAME

    如何将所有这些字段连接到同一个模型但每列的结果不同?因此,从 Results 获取的结果将返回嵌套的 3 个不同用户,其 ID 列在该特定行的 Results 表中。使用相同的模型?

我浏览了 sequelize 的文档,尝试了很多组合,但始终没有达到结果。几乎感觉我最终不得不编写模型,这些模型的名称类似于“First_gu”、“second_guy”、“third_guy”这些字段,以便 Sequalize 工作并自动附加“_id”,就像使用 现在是用户模型。但是对于应该通过belongsTo/hasOne中的“foreignKey”属性来解决的事情感觉太费劲了?

【问题讨论】:

【参考方案1】:

这是一个简单的解决方案。您应该为每个结果的列定义关系。

Results.belongsTo(User,  as:'firstGuy', foreignKey: 'first_guy_id');
Results.belongsTo(User,  as:'secondGuy', foreignKey: 'second_guy_id');
...

然后你可以这样查询:

Results.findById(resultId, 
   include: [
      model: User,
      as: 'firstGuy'
   , 
      model: User,
      as: 'secondGuy'
   ,
   ...
   ]
).then(function(result)
   var firstGuyUser = result.firstGuy;
);

【讨论】:

你救了我的命?

以上是关于sequelize (js) 关联多个列与一个表的主要内容,如果未能解决你的问题,请参考以下文章

如何在关联表Sequelize js中获取自定义字段

在 sequelize.js 中获取与 belongsToMany 的关联

如何使用 sequelize 在一个数据库请求中将数据插入多个表?

Sequelize:模型未关联到 Model2

Sequelize 关联模型查询

Sequelize - 如何从一个表中获取未被另一表关联的条目