簡體   English   中英

使用 Sequelize.js 加入特定列

[英]Join on specific columns using 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 的主鍵以外的東西?

我在Sequelize 文檔中找到了 [options.include[].on] ,但不知道提供我自己的 ON 條件的語法是什么。

您想在關聯本身中定義特殊情況的外鍵名稱,在模型的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 將知道要自動使用哪個外鍵列。

你也可以在你的代碼/控制器文件中提到這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM