Where-Bedingung für verknüpfte Tabelle in Sequelize ORM

Lesezeit: 2 Minuten

Ich möchte eine Abfrage wie diese mit sequelize ORM erhalten:

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("B"."userId" = '100'
       OR "C"."userId" = '100')

Das Problem ist, dass ich in der Where-Klausel nicht auf die Tabelle “B” oder “C” verweisen kann. Folgender Code

A.findAll({
    include: [{
        model: B,
        where: {
            userId: 100
        },
        required: false

    }, {
        model: C,
        where: {
            userId: 100
        },
        required: false
    }]
] 

gibt mir

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id" AND "B"."userId" = 100
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id" AND "C"."userId" = 100

Das ist eine völlig andere Abfrage und ein Ergebnis von

A.findAll({
    where: {
        $or: [
            {'"B"."userId"' : 100},
            {'"C"."userId"' : 100}
        ]
    },
    include: [{
        model: B,
        required: false

    }, {
        model: C,
        required: false
    }]
] 

ist nicht einmal eine gültige Abfrage:

SELECT "A".*,      
FROM "A" 
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("A"."B.userId" = '100'
       OR "A"."C.userId" = '100')

Ist die erste Abfrage überhaupt mit Sequelize möglich, oder sollte ich mich einfach an Rohabfragen halten?

  • sehr nützliche Frage!

    – Properchels

    16. Oktober 2018 um 9:30 Uhr

  • Aktualisierung der Antwort von (Jan Aagaard Meier), hinzufügen subQuery=false Möglichkeit, mit Limit und Offset zu arbeiten

    – Zuschauer sein

    4. Februar 2020 um 6:55 Uhr

Umschließen Sie die Spalten, die verknüpfte Tabellen referenzieren $$

A.findAll({
    where: {
        $or: [
            {'$B.userId$' : 100},
            {'$C.userId$' : 100}
        ]
    },
    include: [{
        model: B,
        required: false

    }, {
        model: C,
        required: false
    }]
}); 

  • Es schlägt alles fehl, wenn ich ein weiteres Include hinzufüge {required: true}. Dann erstellt sequelize eine Unterabfrage mit INNER JOIN und fügt die WHERE-Klausel darin ein. Daher generiert das eine ungültige Abfrage. SELECT “A”.*, FROM (SELECT * FROM “A” INNER JOIN “D” ON “A”..”dId” = “D”..”id” WHERE (“A”..”B.userId” = ‘100 ‘ OR “A”.”C.userId” = ‘100’) ) als “A” LEFT OUTER JOIN “B” ON “A”.”bId” = “B”.”id” LEFT OUTER JOIN “C” ON “A”.”cId” = “C”.”id” Irgendwelche Vorschläge, wie man das löst?

    – xb1itz

    15. September 2016 um 8:19 Uhr


  • Ist diese $$-Syntax irgendwo dokumentiert?

    – Brad Decker

    19. Dezember 2016 um 21:09 Uhr

  • @xb1itz Hattest du Glück, das Problem mit einem zweiten Join zu lösen? Darauf stoße ich auch an.

    – Eric Conner

    10. Januar 2018 um 0:46 Uhr

  • Hier dokumentiert: docs.sequelizejs.com/manual/tutorial/… unter “Spitzenniveau wo mit eifrig geladenen Modellen”

    – Michael

    4. März 2018 um 17:11 Uhr


  • Funktioniert wie es ist, bricht aber ab, wenn ich versuche, etwas hinzuzufügen limit.

    – Iwan Rubinson

    28. Januar 2019 um 10:56 Uhr


Fügen Sie die where-Bedingung im Include zusammen mit join hinzu.

    {
       model: C,
       where: {
        id: 1
       }
   }

  • Unbedingt hinzufügen required: true hier, wenn Sie es als “UND”-Filter verwenden möchten

    – mienaikoe

    28. März 2021 um 21:24 Uhr

1434400cookie-checkWhere-Bedingung für verknüpfte Tabelle in Sequelize ORM

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy