Sequelize - подзапрос в предложении where

Я использую Sequelize в моем Экспресс-приложении. Мне нужно создать запрос, который имеет подзапрос в WHERE предложения.

SELECT *
  FROM MyTable
 WHERE id NOT IN (
       SELECT fkey
         FROM MyOtherTable
        WHERE field1 = 1
          AND field2 = 2
          AND field3 = 3
       )

я сначала попробовал отношения / ассоциации через мои модели, но не смог заставить его работать. Что-то вроде:

MyTable.find( {
    where: {
        id: {
            $notIn: // <= what goes here? Can I somehow reference my include model?
        }
    },
    include: [ {
        model: MyOtherTable,
        where: {
            field1: 1,
            field2: 2,
            field3: 3
    } ]
} );

затем я попытался с помощью Sequelize.where(), не повезло там.

тогда я попробовал Sequelize.literal() и это работает, но не уверен, что это "правильного" способ выполнения подзапроса В где предложение в Sequelize, поскольку я новичок в этом.

MyTable.find( {
    where: {
        id: {
            $notIn: sequelize.literal( 
                '( SELECT fkey ' +
                    'FROM MyOtherTable ' +
                   'WHERE field1 = ' + field1 +
                    ' AND field2 = ' + field2 +
                    ' AND field3 = ' + field3 + 
                ')'
        }
    } 
} );

Я знаю, что я мог бы использовать Sequelize.query() но на самом деле не знаю, должен ли я дотянуться до него или если literal()это сразу, как я чувствую, что есть что-то, что я упускаю из виду.

Я бы очень хотел знать, как выполнить подзапрос в WHERE предложение с Sequelize "правильного" путь.

Спасибо за отзыв!

1 ответов


я столкнулся с аналогичной проблемой в моем проекте. Способ, которым я решил реализовать его, немного отличается по двум причинам:

  1. если в какой - то момент времени Sequelize решает реализовать подзапросы-синтаксис готов.
  2. используйте Sequelize protection agains SQL injection.

вот мой фрагмент кода, надеюсь, это поможет.

const tempSQL = sequelize.dialect.QueryGenerator.selectQuery('MyOtherTable',{
    attributes: ['fkey'],
    where: {
         field1: 1,
         field2: 2,
         field3: 3
    }})
    .slice(0,-1); // to remove the ';' from the end of the SQL

MyTable.find( {
    where: {
        id: {
             $notIn: sequelize.literal('(' + tempSQL + ')'),
        }
    } 
} );

некоторые люди могут не использовать переменную tempSQL и просто создать SQL внутри find структура (возможно, используя вспомогательный метод?)

Я также думаю, что это может быть основой для расширения подзапросов для sequelize, поскольку он использует тот же синтаксис почти.