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

时间:2017-05-27 00:33:22

标签: sql node.js sequelize.js

希望你做得很好。

我有sequelizejs的问题无论我如何在表之间设置关联,我都无法出于某种原因开始工作。我的问题是,我有一张表,名为结果,这个表的结构为:

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

此表连接到用户,这里有趣的部分,表用户具有简单的结构,如此

| 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很容易,即使每列的所有id(first_guy,second ...)都不同但在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。

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

  1. 如何使用sequelize在任何字段上加入结果与使用常规SQL(此处为伪代码)相同“在Results.first_guy_id上INNER JOIN User.id作为MY_FIELD_NAME

  2. 如何将所有这些字段加入同一个模型,但每列的结果不同?因此,结果的获得结果将返回嵌套的3个不同用户,其ID在该特定行的结果表中列出。使用相同的型号?

  3. 我浏览了sequelize的文档,尝试了很多组合但从未实现过结果。这几乎感觉就像我必须最终编写模型一样,这些模型被命名为“First_gu”,“second_guy”,“third_guy”,用于Sequalize工作,并自动附加“_id”,就像它与一样用户模型现在。但对于应该通过belongsTo / hasOne中的“foreignKey”属性解决的事情来说,感觉太过分了吗?

1 个答案:

答案 0 :(得分:2)

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

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;
});