2016-03-22 27 views
10

私はExpressアプリケーションでSequelizeを使用しています。 WHERE句にサブクエリを持つクエリを生成する必要があります。Sequelize - subquery in 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句でサブクエリを行う「適切な」方法だかどうかわから動作しますが、ありません。

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します。

フィードバックありがとうございます!

+0

私はこの質問を介してこのgithubの問題https://github.com/sequelize/sequelize/issues/3961に来て、私はこの質問http://stackoverflow.com/questions/38882185/sequelize-statementwhere-in-statementwhere/39040218#39040218、明らかにsequelize.literalを使用しているのが当面の唯一の方法です。 – galileopy

+0

'sequelize.literal(...)'を使っているようですが –

+0

私はあなたが(未テスト)に役立つこのsrcを見つけました。 http://srlm.io/2015/02/04/sequelize-subqueries/ –

答えて

8

私のプロジェクトでも同様の問題が発生しました。構文は準備ができている - 時間にSequelizeは、サブクエリを実装することを決定した一点での場合

  1. :私はそれを実装することを選択し 方法は、2つの理由のために少し異なっています。
  2. 使用SQLインジェクションを再度続行します。

ここに私のコードスニペットが役立ちます。

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を構築しないことを選択するかもしれない(多分ヘルパーメソッドを使用して?)

を私も、これは、サブクエリの基礎となるかもしれないと思います同じシンタックスをほとんど使用するため、後継のための拡張機能。