如何使用node.js控制sequelize中的内连接查询?

Posted

技术标签:

【中文标题】如何使用node.js控制sequelize中的内连接查询?【英文标题】:How to control the inner join query in sequelize using node.js? 【发布时间】: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)

【问题讨论】:

【参考方案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"
      ]
    )
    

    如果要更改给定查询的 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`;

【讨论】:

以上是关于如何使用node.js控制sequelize中的内连接查询?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 如何使用 Sequelize 交易

Node.js - 使用 'async' 和 'await' 和 sequelize ORM

Node.js:如何在 Sequelize 中使用 Postgres 存储过程?

如何使用 Sequelize 和 node.js 进行批量插入

Node.js / Sequelize.js / Express.js - 如何插入多对多关联? (同步/异步?)

如何在 Node.js 中使用 Sequelize 运行 AND 和 Or 运算符