如何在没有额外查询的情况下删除 sequelize 中的关联?
how to remove association in sequelize without extra query?
我在 exercise
和 muscle
模型之间有很多关联。
我删除了单个关联
models.Exercise.find({where: {id: exerciseId}})
.then(function(exercise){
exercise.removeMuscle(muscleId);
res.sendStatus(200);
});
ORM 运行s 3 个查询,其中 2 个相似
Executing (default): SELECT `Muscule`.`id`, `Muscule`.`title`, `Muscule`.`description`, `Muscule`.`video`, `Muscule`.`createdAt`,
`Muscule`.`updatedAt`, `muscle_exercise`.`createdAt` AS `muscle_exercise.createdAt`, `muscle_exercise`.`updatedAt` AS `muscle_
exercise.updatedAt`, `muscle_exercise`.`MusculeId` AS `muscle_exercise.MusculeId`, `muscle_exercise`.`ExerciseId` AS `muscle_exercise.ExerciseId` FROM `Muscules` AS `Muscule` INNER JOIN `muscle_exercise` AS `muscle_exercise` ON `Muscule`.`id` = `muscle_exercise`.`MusculeId` AND `muscle_exercise`.`ExerciseId` = 11;
Executing (default): SELECT `Muscule`.`id`, `Muscule`.`title`, `Muscule`.`description`, `Muscule`.`video`, `Muscule`.`createdAt`,
`Muscule`.`updatedAt`, `muscle_exercise`.`createdAt` AS `muscle_exercise.createdAt`, `muscle_exercise`.`updatedAt` AS `muscle_
exercise.updatedAt`, `muscle_exercise`.`MusculeId` AS `muscle_exercise.MusculeId`, `muscle_exercise`.`ExerciseId` AS `muscle_exercise.ExerciseId` FROM `Muscules` AS `Muscule` INNER JOIN `muscle_exercise` AS `muscle_exercise` ON `Muscule`.`id` = `muscle_exercise`.`MusculeId` AND `muscle_exercise`.`ExerciseId` = 11;
Executing (default): DELETE FROM `muscle_exercise` WHERE `ExerciseId` = 11 AND `MusculeId` IN (52)
有什么办法可以避免重复查询吗?如果我可以逃避第一个和第二个查询并且 运行 只有第三个实际上做了一些有用的事情,那将是完美的?
您可以像 documentation using set
function 那样传递关联对象数组而不是您尝试删除的对象。但这基本上会给您留下三个查询。
为了仅在一个 DELETE 查询中实现它,您需要在代码中添加一个关系模型。在您的情况下,它看起来像这样:
models.Exercise = sequelize.define("exercise", {
/* attributes */
});
models.Muscle = sequelize.define("muscle", {
/* attributes */
});
models.exercise_muscle_tie = sequelize.define("exercise_muscle_tie", {
}, {
freezeTableName: true
});
models.Exercise.belongsToMany(models.Muscle, { as: 'muscles', foreignKey: 'exerciseId', through: models.exercise_muscle_tie });
models.Muscle.belongsToMany(models.Exercise, { as: 'exercises', foreignKey: 'muscleId', through: models.exercise_muscle_tie });
在您定义它并将其与 belongsToMany
关联到模型后,您的 删除脚本 将是:
models.exercise_muscle_tie.destroy({ where: { exerciseId: 1856, muscleId: 57344 } })
已生成 SQL:
Executing (default):
DELETE FROM `exercise_muscle_tie` WHERE `exerciseId` = 1856 AND `muscleId` = 57344
我在 exercise
和 muscle
模型之间有很多关联。
我删除了单个关联
models.Exercise.find({where: {id: exerciseId}})
.then(function(exercise){
exercise.removeMuscle(muscleId);
res.sendStatus(200);
});
ORM 运行s 3 个查询,其中 2 个相似
Executing (default): SELECT `Muscule`.`id`, `Muscule`.`title`, `Muscule`.`description`, `Muscule`.`video`, `Muscule`.`createdAt`,
`Muscule`.`updatedAt`, `muscle_exercise`.`createdAt` AS `muscle_exercise.createdAt`, `muscle_exercise`.`updatedAt` AS `muscle_
exercise.updatedAt`, `muscle_exercise`.`MusculeId` AS `muscle_exercise.MusculeId`, `muscle_exercise`.`ExerciseId` AS `muscle_exercise.ExerciseId` FROM `Muscules` AS `Muscule` INNER JOIN `muscle_exercise` AS `muscle_exercise` ON `Muscule`.`id` = `muscle_exercise`.`MusculeId` AND `muscle_exercise`.`ExerciseId` = 11;
Executing (default): SELECT `Muscule`.`id`, `Muscule`.`title`, `Muscule`.`description`, `Muscule`.`video`, `Muscule`.`createdAt`,
`Muscule`.`updatedAt`, `muscle_exercise`.`createdAt` AS `muscle_exercise.createdAt`, `muscle_exercise`.`updatedAt` AS `muscle_
exercise.updatedAt`, `muscle_exercise`.`MusculeId` AS `muscle_exercise.MusculeId`, `muscle_exercise`.`ExerciseId` AS `muscle_exercise.ExerciseId` FROM `Muscules` AS `Muscule` INNER JOIN `muscle_exercise` AS `muscle_exercise` ON `Muscule`.`id` = `muscle_exercise`.`MusculeId` AND `muscle_exercise`.`ExerciseId` = 11;
Executing (default): DELETE FROM `muscle_exercise` WHERE `ExerciseId` = 11 AND `MusculeId` IN (52)
有什么办法可以避免重复查询吗?如果我可以逃避第一个和第二个查询并且 运行 只有第三个实际上做了一些有用的事情,那将是完美的?
您可以像 documentation using set
function 那样传递关联对象数组而不是您尝试删除的对象。但这基本上会给您留下三个查询。
为了仅在一个 DELETE 查询中实现它,您需要在代码中添加一个关系模型。在您的情况下,它看起来像这样:
models.Exercise = sequelize.define("exercise", {
/* attributes */
});
models.Muscle = sequelize.define("muscle", {
/* attributes */
});
models.exercise_muscle_tie = sequelize.define("exercise_muscle_tie", {
}, {
freezeTableName: true
});
models.Exercise.belongsToMany(models.Muscle, { as: 'muscles', foreignKey: 'exerciseId', through: models.exercise_muscle_tie });
models.Muscle.belongsToMany(models.Exercise, { as: 'exercises', foreignKey: 'muscleId', through: models.exercise_muscle_tie });
在您定义它并将其与 belongsToMany
关联到模型后,您的 删除脚本 将是:
models.exercise_muscle_tie.destroy({ where: { exerciseId: 1856, muscleId: 57344 } })
已生成 SQL:
Executing (default):
DELETE FROM `exercise_muscle_tie` WHERE `exerciseId` = 1856 AND `muscleId` = 57344