Non credo sia possibile una risposta pulita alla tua domanda. Vedere #1869:
La ricerca sul modello passante/tabella join non è attualmente possibile sfortunatamente.
Per rispondere alla domanda del titolo, Sequelize genererà automaticamente una sottoquery (ad esempio, #1719), ma non si può fare una sottoquery personalizzato. Non ho un riferimento autorevole per un negativo.
Sembra che il tavolo è qualcosa di simile:
EssayStats
EssayId
EssayDate
WordCount
allora si potrebbe fare qualcosa di simile:
return EssayStat.findAll({
attributes: [
[sequelize.literal('((SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" DESC LIMIT 1) - (SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" ASC LIMIT 1))'), 'difference'],
'EssayId'
],
group: ['EssayId']
});
Tutto ciò che si sta facendo è in esecuzione due query SELECT, prendendo il MAX e il MIN da quelle query dopo l'ordine dalla tua variabile di interesse, e poi prendendo la tua differenza. Questo ti darà quello che ti interessa: la differenza del conteggio delle parole tra la versione più recente e la prima versione.
Il trucco qui è incapsulare un'istruzione SELECT in un campo di attributo.
Naturalmente, è disordinato come diamine e probabilmente non è molto meglio di quello in scatola sequelize.query
. Ma risponde al succo della tua domanda.
Una soluzione migliore potrebbe essere quella di denormalizzare alcuni dati e memorizzare "wordCountDelta" nel modello Essay direttamente. Quindi potresti avere un afterCreate
hook per aggiornare automaticamente il campo. Probabilmente sarebbe anche la soluzione più veloce.
Ho risposto a qualcosa di simile here.
Io non la penso così. Il caricamento avido potrebbe essere la cosa più vicina. [Ecco un esempio in cui Sequelize genera una sotto-query tramite caricamento ansioso, a causa di un 'limite' artificiale] (https://github.com/sequelize/sequelize/issues/1719). – bishop
Non so nulla di 'Sequelize.js'. È possibile comporre qualcosa come 'EssayStats t1 LEFT JOIN EssayStats t2 ON t1.EssayId = t2.EssayId AND t1.EssayDate
axiac