2017-01-13 4 views
1

Ich habe 3 Modelle: Post, Photo und Audio.Sequelize Wo zugehöriges Modell ist Null

Ein Post kann ein Foto oder einen Audioclip (oder auch nicht):

models.Post.hasOne(models.Photo, { as: 'photo' }); 
models.Post.hasOne(models.Audio, { as: 'audio' }); 

Ich versuche, diejenigen auszuwählen, die weder haben - das heißt nur ein Text Post. Ich habe zu graben um, und ich kam an (Beschaffung Informationen von here):

db.Post.findAll({ 
    where: { 
     '$photo.id$': { $eq: null }, 
     '$audio.id$': { $eq: null } 
    }, 
    order: [ 
     ['createdAt', 'DESC'] 
    ], 
    include: [{... "photo" and "audio" - both with required: true}], 
}).then((posts) => { 
    ... 
}); 

jedoch, die nicht zu funktionieren scheint (ich glaube nicht, dass ich voll und ganz verstehen, wie die verwandten Modelle referenziert) . Darüber hinaus nutzt die resultierende Abfrage INNER JOINS statt LEFT JOINS so, wenn es Posts und Photos/Audios zu verbinden versucht, es ein leeres Ergebnis statt ein Ergebnis mit allen Werten von Post und leeren Spalten für Photo und Audio produziert.

Die erzeugte Abfrage ist:

SELECT ... FROM (
    SELECT * 
    FROM "Posts" AS "Post" 
    INNER JOIN "Photos" AS "photo" 
     ON "Post"."id" = "photo"."postId" 
    INNER JOIN "Audios" AS "audio" 
     ON "Post"."id" = "audio"."postId" 
    WHERE 
     "photo"."id" IS NULL AND 
     "audio"."id" IS NULL 
) AS ... 

Die Abfrage

SELECT * 
FROM "Posts" AS "Post" 
LEFT JOIN "Photos" AS "photo" 
    ON "Post"."id" = "photo"."postId" 
LEFT JOIN "Audios" AS "audio" 
    ON "Post"."id" = "audio"."postId" 
WHERE 
    "photo"."id" IS NULL AND 
    "audio"."id" IS NULL 

die Ergebnismenge ich suche produziert. Ich denke, mein Problem ist die include: [{ ... required: true }, ...] Flagge für jedes mitgelieferte Modell - aber ich bin mir nicht sicher, wie Sie es für die Abfrage aber nicht benötigen es für die Ergebnissammlung.

In meiner Traumwelt würde die sequelize Abfrage aussehen

db.Post.findAll({ where: { photo: { $eq: null }, audio: ... } })

Antwort

0

Versuchen ohne umfassen

db.Post.findAll({ 
     where: { 
      '$photo.id$': { $eq: null }, 
      '$audio.id$': { $eq: null } 
     }, 
     order: [ 
      ['createdAt', 'DESC'] 
     ] 
    }).then((posts) => { 
     ... 
    }); 
+0

ich die Verbände in den letzten Fällen benötigen, though. –

+0

Dann warum haben Sie wahr, es wird kein Ergebnis geben, wenn die Fotos und Audios leer sind –

+0

Hm, ich sehe, was Sie sagen, jetzt. Ich habe tatsächlich einen separaten Fehler gefunden, bei dem das Einschließen eines Limits die Abfrage unterbricht (Bug hier: https://github.com/sequelize/sequelize/issues/3095) –

Verwandte Themen