使用Sequelize.js加入特定列

时间:2017-05-03 01:43:57

标签: mysql sql node.js orm sequelize.js

我正在尝试使用Sequelize.js连接特定列的某些表。

到目前为止,我的代码类似于:

table_1.findall({
  include: [{
    model: table_2
    attributes: ['id', 'another_id']
    include: [{
      model: table_3
      required: true
      attributes: ['time']
    }]
  }]
})

每个表格的主键都是' id'。

这似乎等同于以下SQL(我为了简洁而显示SELECT *,因为这不是这个问题的焦点):

SELECT *
FROM table_1 as t1
LEFT OUTER JOIN table_2 as t2 ON t1.id = t2.t1_id
INNER JOIN table_3 as t3 ON t2.id = t3.t2_id

我希望有类似的东西:

SELECT *
FROM table_1 as t1
LEFT OUTER JOIN table_2 as t2 ON t1.id = t2.t1_id
INNER JOIN table_3 as t3 ON t2.another_id = t3.t2_id

有没有办法强制t2和t3之间的连接使用t2的主键之外的东西?

我找到[options.include []。on] 在Sequelize documentation中,但不知道提供自己的ON条件的语法是什么。

2 个答案:

答案 0 :(得分:3)

您希望在模型的classMethods部分中定义的关联本身中定义特殊情况外键名称。这是一个表格的示例,它连接到users表两次,使用特别命名的外键:

classMethods: {
  associate(models) {
    this.belongsTo(models.user, {
      foreignKey: 'created_by_user_id',
      as: 'created_by',
    });
    this.belongsTo(models.user, {
      foreignKey: 'updated_by_user_id',
      as: 'updated_by',
    });
  },
},

然后,在你的findAll中,没有必要做任何特别的事情 - sequelize会知道自动使用哪个外键列。

答案 1 :(得分:0)

您还可以在您的代码/控制器文件中这样提及:

const storeModel = model.store;
const bookedTicketModel = model.booked_ticket;
bookedTicketModel.belongsTo (storeModel, {foreignKey: 'storeId'});
storeModel.hasMany (bookedTicketModel, {foreignKey: 'id'});