Соедините 3 таблицы с Sequelize - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь преобразовать приведенный ниже необработанный запрос в ORM, но ничего не достиг.

необработанный запрос

select * from "Invoices" I 
LEFT JOIN "Requests" R ON R."id" = I."requestId" 
LEFT JOIN "Supps" S ON S."requestId" = R."id" 
where S."confirm" = 'OK'

Что я пробовал:

  Requests.belongsTo(Invoices, { foreignKey: "id" });
  Supps.belongsTo(Requests, { foreignKey: "requestId" });
  Supps.hasMany(Requests, { foreignKey: "requestId" });
  Invoices.hasMany(Requests, { foreignKey: "requestId" });

  Invoices.findOne({
    include: [{ model: Requests, required: false }, { model: Supps, required: false }],
    where: { Sequelize.col("Supps.confirm"): { "OK" } }
  }).then(data => {
    console.log(data);
  })

Но это создает очень очень длинный запрос с несколькими подзапросами и неверными данными

1 Ответ

0 голосов
/ 05 февраля 2020

Наверняка вам нужно будет добавить также sourceKey в th ассоциации. ( do c)

Supps.hasMany(Requests, { foreignKey: "requestId" ,sourceKey: '{ID}' });
Invoices.hasMany(Requests, { foreignKey: "requestId",sourceKey: '{ID}'  });

Также вы можете добавить {raw:true}, чтобы получить ответ на один уровень json.

 Invoices.findOne({
    include: [{ model: Requests, required: false }, { model: Supps, required: false }],
    where: { Sequelize.col("Supps.confirm"): { "OK" } },
    raw:true
  }).then(data => {
    console.log(data);
  });
...