Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Orm Sequelize-where子句中的子查询_Orm_Subquery_Where Clause_Sequelize.js - Fatal编程技术网

Orm Sequelize-where子句中的子查询

Orm Sequelize-where子句中的子查询,orm,subquery,where-clause,sequelize.js,Orm,Subquery,Where Clause,Sequelize.js,我正在我的Express应用程序中使用。我需要生成一个查询,该查询在WHERE子句中有一个子查询 SELECT * FROM MyTable WHERE id NOT IN ( SELECT fkey FROM MyOtherTable WHERE field1 = 1 AND field2 = 2 AND field3 = 3 ) 我首先尝试通过我的模型建立关系/关联,但无法使其发挥

我正在我的Express应用程序中使用。我需要生成一个查询,该查询在
WHERE
子句中有一个子查询

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

我首先尝试通过我的模型建立关系/关联,但无法使其发挥作用。比如:

MyTable.find({
其中:{
身份证:{

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

  • 如果Sequelize在某个时间点决定实现子查询,则语法已准备就绪
  • 对SQL注入使用Sequelize保护
  • 这是我的代码片段,希望对你有所帮助

    续集v5

    const tempSQL=sequelize.dialogue.QueryGenerator.selectQuery('MyOtherTable'{
    属性:['fkey'],
    其中:{
    字段1:1,
    字段2:2,
    字段3:3
    }})
    .slice(0,-1);//从SQL结尾删除“;”
    MyTable.find({
    其中:{
    身份证:{
    [Sequelize.Op.notIn]:Sequelize.literal(`(${tempSQL})`)
    }
    } 
    } );
    
    续集v6

    const tempSQL=sequelize.dialogue.queryGenerator.selectQuery('MyOtherTable'{
    属性:['fkey'],
    其中:{
    字段1:1,
    字段2:2,
    字段3:3
    }})
    .slice(0,-1);//从SQL结尾删除“;”
    MyTable.find({
    其中:{
    身份证:{
    [Sequelize.Op.notIn]:Sequelize.literal(`(${tempSQL})`)
    }
    } 
    } );
    
    有些人可能选择不使用tempSQL变量,而只是在find结构中构建SQL(可能使用helper方法?)


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

    通过这个问题,我来到了github问题,显然使用sequelize.literal是目前唯一的方法。似乎使用
    sequelize.literal(…)
    仍然是goI找到此src的方法,可能会对您有所帮助(未经测试)。请在您完成后告诉我您的测试。此解决方案是否允许sql注入?@Sash取决于
    field1
    field2
    field3
    和/或它们是否已被清除/转义的源。对于本例,值在后端定义。是
    其中的
    对象在sql生成器和查找中查询安全可互换?我可以在这里和那里使用相同的语法吗?ASFAIK是的。
    find
    方法在内部使用
    QueryGenerator
    。这就是我第一次使用这种方法的原因。谢谢。当我需要对包含的模型使用
    where
    的限制/偏移量时,这节省了我的时间。我生成了一个子查询,如yo我使用的是v6,但GetDialogue()方法对我来说不可用use@ShaharHadas我明白了,我在这里更彻底地阅读了其他评论,我可以使用Sequelize实例来完成它。谢谢!现在对答案投了赞成票!:)