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
字段表示的内容(小时,分钟,秒等)进行更改。