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 ответов
я столкнулся с аналогичной проблемой в моем проекте. Способ, которым я решил реализовать его, немного отличается по двум причинам:
- если в какой - то момент времени Sequelize решает реализовать подзапросы-синтаксис готов.
- используйте 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, поскольку он использует тот же синтаксис почти.