【问题标题】:How to control the inner join query in sequelize using node.js?如何使用node.js控制sequelize中的内连接查询?
【发布时间】:2019-04-22 05:13:52
【问题描述】:

天模型:

workoutId: {
    type: Sequelize.INTEGER,
},
traineeId: {
  type: Sequelize.INTEGER,
  primaryKey: true
},
dayNumber: {
  type: Sequelize.INTEGER,
  primaryKey: true
},
status: {
  type: Sequelize.INTEGER
},

WorkoutsExercises 模型:

workout_id: {
  type: Sequelize.INTEGER,
  primaryKey: true
},
exercise_name: {
  type: Sequelize.INTEGER,
  primaryKey: true
},
coach_id: {
  type: Sequelize.INTEGER,
  primaryKey: true
}

我只是想在两个表之间进行内部连接以返回每天的所有练习,我使用以下

const Days = require('../models/days');
const WorkoutsExercises = require('../models/workoutsExercises');

Days.findAll({
  include: [{
    model: WorkoutsExercises,
      required: true
   }]        
})

此函数返回以下查询:

SELECT
  `day`.`workoutId`,
  `day`.`dayNumber`,
  `day`.`status`,
  `day`.`traineeId`,
  
  `workoutsExercises`.`workout_id` AS `workoutsExercises.workout_id`, 
  `workoutsExercises`.`exercise_name` AS `workoutsExercises.exercise_name`, 
  `workoutsExercises`.`coach_id` AS `workoutsExercises.coach_id`

FROM `days` AS `day`

INNER JOIN `workoutsExercises` AS `workoutsExercises` 

ON `day`.`dayNumber` = `workoutsExercises`.`workout_id`; 

如何将开启条件从 (day.dayNumber) 更改为 (day.workoutId)

【问题讨论】:

    标签: node.js join sequelize.js inner-join


    【解决方案1】:
    1. 如果您在两个模型之间有多个关系,您可以创建多个关联:

      User.hasMany(Task);
      Task.belongsTo(User);
      
      User.hasMany(Task, {as: "secondAssociation", foreignKey, sourceKey});
      Task.belongsTo(User, {as: "secondAssociation", foreignKey, targetKey});
      

      您可以使用不同的 ON 子句运行此查询,该子句由您提供的用于创建关联的 foreignKey(和 sourceKey/targetKey)值确定:

      User.findAll({
        include: [{
          model: Task
        }]
      
      User.findAll({
        include: [{
          model: Task,
          as: "secondAssociation"
        }]
      })
      
    2. 如果要更改给定查询的 ON 子句,可以使用 Model.findAll 方法的 include[].on 选项。

      User.findAll({
        include: [{
          model: Task,
          on: {} //Use Sequelize.Op.col for reference on other column
        }]
      

    【讨论】:

      【解决方案2】:

      关系应该如下

      WorkoutExercises.hasMany(Day, {foreignKey: 'workout_id'})
      Day.belongsTo(WorkoutExercises, {foreignKey: 'workout_id', targetKey: 'workout_id'})
      

      目标键是改变 ON 子句的原因,我们将使用相同的查询:

      Days.findAll({
        include: [{
          model: WorkoutsExercises,
          required: true
        }]        
      })
      

      给出:

      SELECT
      
        `day`.`dayNumber`,
        `day`.`dayDate`,
        `day`.`status`,
        `day`.`traineeId`, 
        `day`.`workoutId`, 
      
        `workoutsExercises`.`exercise_name` AS `workoutsExercises.exercise_name`,
        `workoutsExercises`.`workout_id` AS `workoutsExercises.workout_id`,
        `workoutsExercises`.`coach_id` AS `workoutsExercises.coach_id`
       
       FROM `days` AS `day`
       
       INNER JOIN `workoutsExercises` AS `workoutsExercises`
       
       ON `day`.`workout_id` = `workoutsExercises`.`workout_id`;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-25
        • 2021-04-11
        • 2019-01-27
        • 2015-04-02
        • 1970-01-01
        • 2015-10-12
        • 2020-04-27
        • 1970-01-01
        相关资源
        最近更新 更多