web-dev-qa-db-ja.com

Sequelize OR条件オブジェクト

このようなオブジェクトを作成することにより

var condition=
{
  where:
  {
     LastName:"Doe",
     FirstName:["John","Jane"],
     Age:{
       gt:18
     }
  }    
}

そしてそれを渡す

Student.findAll(condition)
.success(function(students){

})

このようにSQLを美しく生成できます

"SELECT * FROM Student WHERE LastName='Doe' AND FirstName in ("John","Jane") AND Age>18"

しかし、それはすべて「AND」条件ですが、条件オブジェクトを作成して「OR」条件を生成するにはどうすればよいですか?

51
Morio

現在、別の形式があるようです

where: {
    LastName: "Doe",
    $or: [
        {
            FirstName: 
            {
                $eq: "John"
            }
        }, 
        {
            FirstName: 
            {
                $eq: "Jane"
            }
        }, 
        {
            Age: 
            {
                $gt: 18
            }
        }
    ]
}

生成します

WHERE LastName='Doe' AND (FirstName = 'John' OR FirstName = 'Jane' OR Age > 18)

ドキュメントを参照してください: http://docs.sequelizejs.com/en/latest/docs/querying/#where

62
Morio

つかいます Sequelize.or

var condition = {
  where: Sequelize.and(
    { name: 'a project' },
    Sequelize.or(
      { id: [1,2,3] },
      { id: { lt: 10 } }
    )
  )
};

参照Sequelize.or

編集:また、これは修正されました。最新の方法については、 Morio's answer

27
evanhadfield

クエリに関するドキュメント を参照してください。

それはそのようになります:

$or: [{a: 5}, {a: 6}]  // (a = 5 OR a = 6)
15
Evan Siroky

文字列ベースの演算子は将来廃止される予定です(おそらくコンソールで警告を見たことがあるでしょう)。

これをシンボリック演算子で動作させるのは非常に混乱し、2つの例で docs を更新しました。

Post.findAll({
  where: {
    [Op.or]: [{authorId: 12}, {authorId: 13}]
  }
});
// SELECT * FROM post WHERE authorId = 12 OR authorId = 13;

Post.findAll({
  where: {
    authorId: {
      [Op.or]: [12, 13]
    }
  }
});
// SELECT * FROM post WHERE authorId = 12 OR authorId = 13;
13
CoredusK

Sequelize 4の場合

問い合わせ

SELECT * FROM Student WHERE LastName='Doe' 
AND (FirstName = "John" or FirstName = "Jane") AND Age BETWEEN 18 AND 24 

演算子 を使用した構文

const Op = require('Sequelize').Op;

var r = await to (Student.findAll(
{
  where: {
    LastName: "Doe",
    FirstName: {
      [Op.or]: ["John", "Jane"]
    },
    Age: {
      // [Op.gt]: 18
      [Op.between]: [18, 24]
    }
  }
}
));

ノート

  • セキュリティの向上 の場合、Sequelizeはエイリアス演算子$(例:$and$or ...)
  • {freezeTableName: true}テーブルモデルに設定すると、Sequelizeはその名前の複数形に対してクエリを実行します(Student->Students
9
inmyth

Sequelizeバージョン5では、この方法を使用することもできます(Operator Sequelizeを完全に使用):

var condition = 
{ 
  [Op.or]: [ 
   { 
     LastName: {
      [Op.eq]: "Doe"
      },
    },
   { 
     FirstName: {
      [Op.or]: ["John", "Jane"]
      }
   },
   {
      Age:{
        [Op.gt]: 18
      }
    }
 ]
}

そして、これを含める必要があります:

const Op = require('Sequelize').Op

そしてそれを渡します:

Student.findAll(condition)
.success(function(students){ 
//
})

次のようなSQLを美しく生成できます。

"SELECT * FROM Student WHERE LastName='Doe' OR FirstName in ("John","Jane") OR Age>18"
4
Muhammad Fari