Sequelize - where子句中的子查询

时间:2016-03-22 20:36:29

标签: orm subquery where-clause sequelize.js

我在Express应用中使用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的where子句中进行子查询的方式,因为我是新手。< / p>

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

我也知道我可以使用Sequelize.query()但是我不知道我是否应该接触它,或者literal()是否正确,因为我觉得我有一些东西可以忽略。< / p>

我真的想知道如何使用Sequelize “正确的”方式在WHERE子句中执行子查询。

感谢您的反馈!

1 个答案:

答案 0 :(得分:16)

我在项目中遇到过类似的问题。 我选择实现它的方式有点不同有两个原因:

  1. 如果在某个时间点Sequelize决定实施子查询 - 语法就绪。
  2. 再次使用Sequelize保护SQL注入。
  3. 这是我的代码段,希望它有所帮助。

    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变量,只是在find结构中构建SQL(可能使用帮助器方法?)

    我也认为这可能是sequelize的子查询扩展的基础,因为它几乎使用相同的语法。