2017-03-25 10 views
1

Sequelize 부교수 테이블 컬럼 값 :Sequelize - 나는 sequelize 모델이 쿼리를 수행 할 위치 조건</p> <p>부교수 테이블 열 - WHERE 조건

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를 사용하여 시도를() 함수 , 그러나 여전히 가치를 뿌리 뽑을 수는 없습니다. 내 코드

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

지금 값 만 sequelize.col ("Activity.duration")는 모든

에 영향을주지 않습니다 반환하는 쿼리를 찾기

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 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"기간 값을 채우지 않습니다. 그리고 아무런 오류도 없습니다. 이것을 바로 잡기 위해 무엇을해야합니다. 미리 감사드립니다

답변

1

과 결합 된 DATE_SUB() 기능을 사용해 볼 수 있습니다. 아래의이 유사한 쿼리를 생성 할 코드 위

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 필드. 또한 MINUTE 간격을 사용했지만 Activity.duration 필드가 나타내는 내용 (시, 분, 초 등)에 따라 변경합니다.

+0

답해 주셔서 감사합니다. 하지만이 오류가 발생합니다. 오류 : ER_BAD_FIELD_ERROR : 'where 절'에서 알 수없는 'Activity.duration'열 –

+0

'INTERVAL'활동 "."duration "MINUTE"을 시도하거나 도움이되지 않으면 생성중인 SQL을보고 '활동 '액티비티 테이블의 알맞은 별명을 사용하십시오. – piotrbienias

+0

고마워요, 필수 항목 추가 : 활동 모델에서 true로 설정하면 문제가 해결되었습니다. :) –