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

Jer*_*mys 1 sql node.js sequelize.js

希望你做得很好。

我有sequelizejs的问题,无论如何在表之间建立关联,由于某种原因我都无法工作。我的问题是,我有一个名为Results的表,该表的结构为:

| id (primary) | first_guy_id | second_guy_id | third_guy_id | notes |
|--------------|--------------|---------------|--------------|-------|
|              |              |               |              |       |
Run Code Online (Sandbox Code Playgroud)

该表连接到Users,这是有趣的部分,表Users具有简单的结构,如下所示

| id (primary) | first | last |
|--------------|-------|------|
|              |       |      |
Run Code Online (Sandbox Code Playgroud)

我想对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",
}
Run Code Online (Sandbox Code Playgroud)

即使每列(first_guy,second ...)的所有ID都不相同,在常规SQL中执行SQL JOIN也很容易,但是达到这样的目标会使我自己完全没有希望。

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

Results.hasOne(User, { as:'first_guy', foreignKey: 'first_guy' });
User.belongsTo(Results, { as: 'first_guy' }); 
Run Code Online (Sandbox Code Playgroud)

使用进行实际通话时

findOne ...
   include: [
        { model: User,
          include: [
            {
              model: User,
              as: 'first_ugy',
              where: {
                    'id': sequelize.col('Results.first_guy_id')
              },
            }
          ],
        },
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ER_BAD_FIELD_ERROR: Unknown column 'Results.user_id' in 'field list'
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 如何将结果与任何常规字段(在此处为伪代码)进行序列化连接的方式相同,“将Results.first_guy_id上的INNER JOIN User.id设为MY_FIELD_NAME

  2. 如何将所有这些字段连接到同一模型,但每一列的结果不同?因此,来自“ 结果”的获取结果将通过该特定行的“ 结果”表中列出的ID返回嵌套的3个不同用户。使用相同的模型?

我浏览了sequelize的文档,尝试了多种组合,但从未达到结果。几乎感觉就像我不得不结束编写模型,这些模型被命名为“ First_gu”,“ second_guy”,“ third_guy”等字段,Sequalize才能工作并像现在使用User模型一样在其中自动附加“ _id” 。但是,对于应该由belongsTo / hasOne中的“ foreignKey”属性解决的问题,这感觉太费力了?

Til*_*bek 5

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

Results.belongsTo(User, { as:'firstGuy', foreignKey: 'first_guy_id'});
Results.belongsTo(User, { as:'secondGuy', foreignKey: 'second_guy_id'});
...
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样进行查询:

Results.findById(resultId, {
   include: [{
      model: User,
      as: 'firstGuy'
   }, {
      model: User,
      as: 'secondGuy'
   },
   ...
   ]
}).then(function(result){
   var firstGuyUser = result.firstGuy;
});
Run Code Online (Sandbox Code Playgroud)