2016-03-22 26 views
10

Ekspres uygulamasında Sequelize kullanıyorum. WHERE maddesinde bir alt sorguya sahip bir sorgu oluşturmanız gerekir. Sequelize - yan tümcesinde

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

Önce benim modeller üzerinden ilişkiler/dernek çalıştım ama işe alamadı. Bir şey gibi:
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 
    } ] 
}); 

Sonra Sequelize.where(), orada hiç şans kullanarak çalıştı.

Sonra Sequelize.literal() ve bu eserler denedik ama Sequelize içinde fıkra ben buna yeniyim olarak nerede bir alt sorgu yapmanın "doğru" yolu olmadığından emin değil.

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

Ben de Sequelize.query() kullanabilirsiniz ama bunun için ulaşmalıdır yoksa gibi hissediyorum olarak literal() hakkı uzakta olup olmadığını bakan ediyorum şey varsa gerçekten bilmiyorum biliyorum.

"düzgün" yolunu kullanarak biryan tümcesinde alt sorgunun nasıl gerçekleştirileceğini gerçekten bilmek isterim.

Geri bildiriminiz için teşekkürler!

+0

Bu soruya http://stackoverflow.com/questions/38882185/sequelize-statementwhere-in-statementwhere üzerinden bu github sorununu https://github.com/sequelize/sequelize/issues/3961 adresinden ulaştım./39040218 # 39040218 ve görünüşte sequelize.literal kullanarak şu an için tek yoldur. – galileopy

+0

'sequelize.literal (...)' kullanarak gibi görünüyor hala gitmek için yoldur –

+0

Ben size yardımcı olabilir bu src buldum (UNTESTED). Bu http://srlm.io/2015/02/04/sequelize-subqueries/ –

cevap

8

Projemde benzer bir sorunla karşılaştım. bunu uygulamaya seçtiğim yolu iki nedenden dolayı biraz farklıdır: zamanında

  1. Eğer bir noktadır Sequelize alt sorguları uygulamaya karar - sözdizimi hazırdır.
  2. SQL yerleştirme korumasını agains kullanın.

İşte kod snippet'im, umarım yardımcı olur.

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 + ')'), 
     } 
    } 
}); 

Bazı insanlar tempSQL değişken kullanın ve basit bulmak yapının içinde SQL inşa seçebilirsiniz (belki bir yardımcı yöntemini kullanarak?)

Ben de bu bir alt sorguları için temel olabileceğini düşünüyorum Neredeyse aynı sözdizimini kullandığından, genişletmek için uzantı.