web-dev-qa-db-fra.com

Sequelize OR objet de condition

En créant un objet comme celui-ci

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

et le transmettre

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

})

Il pourrait magnifiquement générer du SQL comme celui-ci

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

Cependant, tout est "ET", comment pourrais-je générer une "OU" en créant un objet de condition?

51
Morio

Semble il y a un autre format maintenant

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

Va générer

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

Voir la doc: http://docs.sequelizejs.com/fr/latest/docs/querying/#where

62
Morio

Utilisation Sequelize.or:

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

Référence (recherche de Sequelize.or)

Edit: De plus, cela a été modifié et pour la dernière méthode, voir réponse de Morio ,

27
evanhadfield

Voir le documentation sur l'interrogation .

Ce serait:

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

Les opérateurs basés sur des chaînes seront obsolètes à l'avenir (vous avez probablement déjà vu l'avertissement dans la console).

Faire en sorte que cela fonctionne avec des opérateurs symboliques était assez déroutant pour moi, et j'ai mis à jour le docs avec deux exemples.

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

Pour Sequelize 4

Question

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

Syntaxe avec opérateurs

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]
    }
  }
}
));

Remarques

  • Pour meilleure sécurité Sequelize recommande de supprimer les opérateurs d'alias $ (par exemple $and, $or ...)
  • Sauf si vous avez {freezeTableName: true} défini dans le modèle de table, alors Sequelize interrogera la forme plurielle de son nom (Student -> Students )
9
inmyth

Dans Sequelize version 5, vous pouvez également utiliser cette méthode (utiliser pleinement Operator Sequelize):

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

Et puis, vous devez inclure ceci:

const Op = require('Sequelize').Op

et le transmettre:

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

Il pourrait magnifiquement générer SQL comme ceci:

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