Как управлять запросом внутреннего соединения в sequelize, используя node.js? - PullRequest
0 голосов
/ 19 ноября 2018

Дни модель:

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

WorkoutsExercises модель:

exercise_name: {
  type: Sequelize.INTEGER,
  primaryKey: true
},
workout_id: {
  type: Sequelize.DATE,
  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`.`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`.`dayNumber` = `workoutsExercises`.`workout_id`; 

как я могу изменить условие включения с (day. dayNumber) на (day. workoutId)

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Отношение должно быть следующим:

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`;
0 голосов
/ 01 декабря 2018
  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 для данного запроса, вы можете использовать include[].on параметр Model.findAll метод.

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