如何在没有额外查询的情况下删除sequelize中的关联?

Ser*_*nko 1 mysql orm node.js sequelize.js

exercisemuscle模型之间有很多很多关联.我删除单一关联

models.Exercise.find({where: {id: exerciseId}})
                .then(function(exercise){
                    exercise.removeMuscle(muscleId);
                    res.sendStatus(200);
                });
Run Code Online (Sandbox Code Playgroud)

ORM运行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)
Run Code Online (Sandbox Code Playgroud)

有没有办法避免重复查询?如果我可以逃避第一个和第二个查询并且仅运行第三个实际做一些有用的事情,那将是完美的吗?

And*_*sko 7

您可以像使用set函数传递相关对象数组的文档一样,而不使用您尝试删除的对象.但这无论如何基本上都会留下三个查询.

为了在一个DELETE查询中创建它,您需要在代码中添加一个tie模型.在你的情况下,它看起来像这样:

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 });
Run Code Online (Sandbox Code Playgroud)

在您定义它并将其与belongsToMany模型相关联后,您的删除脚本将是:

models.exercise_muscle_tie.destroy({ where: { exerciseId: 1856, muscleId: 57344 } })
Run Code Online (Sandbox Code Playgroud)

生成的SQL:

Executing (default): 
DELETE FROM `exercise_muscle_tie` WHERE `exerciseId` = 1856 AND `muscleId` = 57344
Run Code Online (Sandbox Code Playgroud)