【问题标题】:sequelize (js) association for multiple columns with one tablesequelize (js) 关联多个列与一个表
【发布时间】: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。

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

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

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

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

【问题讨论】:

    标签: sql node.js sequelize.js


    【解决方案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;
    });
    

    【讨论】:

    • 你救了我的命?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多