如何使用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 - 使用 'async' 和 'await' 和 sequelize ORM
Node.js:如何在 Sequelize 中使用 Postgres 存储过程?
如何使用 Sequelize 和 node.js 进行批量插入