javascript
  • sql
  • postgresql
  • orm
  • sequelize.js
  • 2016-03-28 4 views 13 likes 
    13

    ich Abfrage wie folgt mit sequelize ORM erhalten möchten:Wo Bedingung für verknüpfte Tabelle in Sequelize ORM

    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 sequelise dass ich nicht in where-Klausel „B“ oder „C“ Tabelle referenzieren . Folgenden 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 
    

    , die ganz andere Frage ist, und das Ergebnis der

    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 zuerst Abfrage sogar möglich mit Sequeliz e, oder sollte ich einfach bei rohen Abfragen bleiben?

    Antwort

    23

    Wickeln Sie die Spalten, die Referenztabellen verbunden in $$

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

    Alles schlägt fehl, wenn ich hinzufügen, ein anderes umfassen, ist, dass '{required: true}'. Sequelize macht dann Unterabfrage mit INNER JOIN und setzt die WHERE-Klausel hinein. Daher wird eine ungültige Abfrage generiert. SELECT "A". *, FROM (SELECT * von "A" INNER JOIN "D" ON "A". "Did" = "D". "Id" WHERE ("A". "B .userId "= '100' ODER" A "." C.userId "= '100') ) als" A " LINKER AUSSENBEREICH" B "AUF" A "." BId "=" B "." ID " LINKS OUTER JOIN" C "ON" A "." cId "=" C "." id " Irgendwelche Vorschläge, um dies zu lösen? – xb1itz

    +11

    Ist diese $$ Syntax irgendwo dokumentiert? –

    +0

    Super nützliche Funktion, habe es nicht auf Dokumente gefunden – renatoargh

    Verwandte Themen