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

Posted

技术标签:

【中文标题】如何在没有额外查询的情况下删除续集中的关联?【英文标题】:how to remove association in sequelize without extra query? 【发布时间】:2015-05-16 13:25:55 【问题描述】:

exercisemuscle 模型之间存在多对多关联。 我删除了单个关联

models.Exercise.find(where: id: exerciseId)
                .then(function(exercise)
                    exercise.removeMuscle(muscleId);
                    res.sendStatus(200);
                );

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)

有什么办法可以避免重复查询?如果我可以逃避第一个和第二个查询并只运行第三个真正有用的查询,那将是完美的吗?

【问题讨论】:

【参考方案1】:

您可以像documentation using set function 那样传递关联对象的数组,而无需尝试删除该对象。但这基本上给你留下了三个查询。

为了在一个 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 );

在您定义它并将其与 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

【讨论】:

以上是关于如何在没有额外查询的情况下删除续集中的关联?的主要内容,如果未能解决你的问题,请参考以下文章

如何在node.js中拥有多个关联/条件/包含在findAll上的续集

休眠一对多关联删除

如何在没有动画的情况下从集合视图中删除项目?

如何在不删除项目本身的情况下删除单个 HABTM 关联项目?

续集在关联模型上的位置

如何在不发出额外查询的情况下更新刚刚检索到的记录?