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: ... } })
ich die Verbände in den letzten Fällen benötigen, though. –
Dann warum haben Sie wahr, es wird kein Ergebnis geben, wenn die Fotos und Audios leer sind –
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) –