Можно ли ГДЕ по вложенным включить в Sequelize? - PullRequest
1 голос
/ 21 июня 2019

У меня есть проблема, на которой я застрял, но безрезультатно - по внешнему виду похож на Где условие для объединенной таблицы в Sequelize ORM , за исключением того, что я хотел бы запроситьпредыдущее соединение.Возможно, код объяснит мою проблему.Рад предоставить любую дополнительную информацию.

Модели:

A.hasMany(B);
B.belongsTo(A);
B.hasMany(C);
C.belongsTo(B);

Это то, чего я хотел бы достичь с помощью Sequelize:

SELECT *
FROM `A`AS `A`
LEFT OUTER JOIN `B` AS `B` ON `A`.`id` = `B`.`a_id`
LEFT OUTER JOIN `C` AS `B->C` ON `B`.`id` = `B->C`.`b_id`
    AND (`B`.`b_columnName` = `B->C`.`c_columnName`);

Вот как я представляю эту работу: (вместо этого он создаст необработанный запрос (2 необработанных запроса, для AB / C) с AND ( `C`.`columnName` = '$B.columnName$')) наобъединение (второй аргумент - строка). Пробовали sequelize.col, sequelize.where(sequelize.col... и т. д.)

A.findOne({
    where: { id: myId },
    include: [{
        model: B,
        include: [{
            model: C,
            where: { $C.c_columnName$: $B.b_columnName$ }
        }]
    }]
});

1 Ответ

0 голосов
/ 21 июня 2019

Используйте оператор запроса Op.col, чтобы найти столбцы, которые соответствуют другим столбцам в вашем запросе.Если вы присоединяетесь только к одной таблице, вы можете передать объект вместо массива, чтобы сделать его более кратким.

const Op = Sequelize.Op;

const result = await A.findOne({
  include: {
    model: B,
    include: {
      model: C,
      where: {
        c_columnName: {
          [Op.col]: 'B.b_columnName',
        },
      }
    },
  },
});
...