Не мисля, че е възможен ясен отговор на въпроса ви. Вижте #1869 :
За да отговори на въпроса от заглавието, Sequelize автоматично ще генерира подзаявка (напр. #1719 ), но не можете да направите персонализирана подзаявка. Нямам авторитетна референция за негатив.
Изглежда, че вашата таблица е нещо подобно:
EssayStats
EssayId
EssayDate
WordCount
Тогава можете да направите нещо подобно:
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']
});
Всичко, което прави, е да изпълнява две SELECT заявки, като взема MAX и MIN от тези заявки след подреждане по вашата променлива, която ви интересува, и след това взема вашата разлика. Това ще ви даде това, което ви интересува:разликата в броя на думите между най-новата и първата версия.
Номерът тук е да капсулирате оператор SELECT в поле за атрибут.
Разбира се, по дяволите е разхвърлян и вероятно не е много по-добър от консервирания sequelize.query
. Но отговаря на същината на въпроса ви.
По-добро решение може да бъде да денормализирате данните си и да съхранявате "wordCountDelta" директно във вашия модел на есе. След това можете да имате afterCreate
кука
за автоматично актуализиране на полето. Това най-вероятно би било и най-бързото решение.
Отговорих на нещо подобно тук .