Sequelize – 将表中的列值与条件相关联

Sequelize – 在哪里条件关联表列

我想要在sequelize模型中执行这个查询:

SELECT * FROM `model_game` AS `Game` INNER JOIN `model_activity` AS `Activity` ON `Game`.`ActivityId` = `Activity`.`id` WHERE `Game`.`startAt` > ('2017-03-25 07:37:36'-`Activity.duration`) AND `Game`.`status` = 'NotStarted'; 

我尝试使用sequelize.col()函数,但仍然不能poulate的价值。 我的代码如下

 My Game model . table name model_game var Game = sequelize.define("Game", { startAt: DataTypes.DATE, status: DataTypes.ENUM('NotStarted','Completed') }, { classMethods: { associate: function(models) { Activity.belongsTo(models.Activity); } } }); 

我的活动模型,表名model_activity

 var Activity = sequelize.define("Activity", { title: DataTypes.STRING, duration: DataTypes.INTEGER },{ classMethods: { associate: function(models) { Activity.hasMany(models.Game); } } }); 

find查询,现在返回值,但sequelize.col(“Activity.duration”)根本没有任何效果

 var currentTime = moment(); models.Game.findAndCountAll({ where: { status: 'NotStarted', startAt: {gt: currentTime.subtract(moment.duration(sequelize.col("Activity.duration"), 'minutes'))}, }, include: [{ model: models.Activity }] }).then(function(result) { //Success }); 

但上面的代码不会填充“Activity.duration”持续时间值。 而且没有错误,应该做些什么来纠正这一点。 提前致谢

您可以尝试使用DATE_SUB()函数结合sequelize.literal

 models.Game.findAndCountAll({ where: { status: 'NotStarted', startAt: { $gt: models.sequelize.fn( 'DATE_SUB', models.sequelize.literal('NOW()'), models.sequelize.literal('INTERVAL Activity.duration MINUTE') ) } }, include: [models.Activity] }).then(result => { // result... }); 

上面的代码会生成类似下面这个的查询:

 SELECT * FROM games INNER JOIN activities ON games.activityId = activities.id WHERE games.status = 'NotStarted' AND games.startAt > DATE_SUB(NOW(), INTERVAL activities.duration MINUTE); 

根据您的代码和您想要获得的查询,我已经使用NOW()作为您要从中减去Activity.duration字段的date。 此外,我已经使用了MINUTE间隔,但是您可以根据Activity.duration字段表示的内容(小时,分钟,秒等)进行更改。