OR-Bedingungsobjekt fortführen


76

Indem Sie ein solches Objekt erstellen

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

und gib es weiter

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

})

Es könnte so wunderbar SQL generieren

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

Es ist jedoch alles eine UND-Bedingung. Wie kann ich eine ODER-Bedingung generieren, indem ich ein Bedingungsobjekt erstelle?


1
Ich habe 3 Arten oder Betreiber verwendet werden ... gesehen where: { $or : [ {attr:val}, {attr:val}] }, where : { $or : { attr:val, attr2:val} },where: { attr: { $or: [val, val] } }
Muhammad Umer

Antworten:


85

Es scheint, dass es jetzt ein anderes Format gibt

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

Wird generieren

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

Siehe das Dokument: http://docs.sequelizejs.com/en/latest/docs/querying/#where


1
Das sollte sein $or: { ... }. Beachten Sie, dass [und ]sollte {und}
briangonzalez

1
Sie sind beide falsch, siehe meine Antwort für die richtige Syntax.
Evan Siroky

Ich bevorzuge diesen Weg vor dem und / oder funktionalen Weg, den @evanhadfield vorgeschlagen hat, da er ordentlicher ist.
Mraxus

Wie würde ich das Folgende in Folge tun? ... wo (A oder B) und (C oder D)
user3662456

3
Verwenden Sie [Op.or]jetzt von sequelize const { Op } = require('sequelize')anstelle von $orals Schlüssel für sequelize 5+. Sie haben sie in Symbole geändert.
Kidcapital

33

String-basierte Operatoren werden in Zukunft veraltet sein (Sie haben wahrscheinlich die Warnung in der Konsole gesehen).

Es war für mich ziemlich verwirrend, dies mit symbolischen Operatoren zum Laufen zu bringen, und ich habe die Dokumente mit zwei Beispielen aktualisiert .

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;

Ich habe gesehen, wie 3 Wege oder Operatoren verwendet werden ... `where: {$ or: [{attr: val}, {attr: val}]}`, `where: {$ or: {attr: val, attr2: val}} `,` where: {attr: {$ or: [val, val]}} `
Muhammad Umer

32

Verwendung Sequelize.or:

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

Referenz (Suche nach Sequelize.or)

Bearbeiten: Auch dies wurde geändert und für die neueste Methode siehe Morios Antwort ,



16

Für Sequelize 4

Abfrage

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

Syntax mit Operatoren

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

Anmerkungen

  • Für eine bessere Sicherheit Sequelize empfiehlt fallen alias Operatoren $(zB $and, $or...)
  • Sofern Sie nicht {freezeTableName: true}im Tabellenmodell festgelegt haben, fragt Sequelize nach der Pluralform seines Namens (Student -> Students ).

16

In Sequelize Version 5 können Sie möglicherweise auch diese Methode verwenden (Operator Sequelize vollständig verwenden):

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

Und dann müssen Sie Folgendes einschließen:

const Op = require('Sequelize').Op

und gib es weiter:

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

Es könnte SQL wie folgt wunderbar erzeugen:

"SELECT * FROM Student WHERE LastName='Doe' OR FirstName in ("John","Jane") OR Age>18"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.