Sequelize actualización de tabla intermedia en relación muchos a muchos
No veo cómo puedo actualizar una tabla de unión con múltiples IDs. Entonces quiero actualizar una tabla de unión para que las filas con IDs faltantes se eliminen y se creen nuevas.
Esta es mi configuración
ActorFilm.belongsTo(models.Actor, { foreignKey: ‘actorId’, targetKey: ‘id’ });
ActorFilm.belongsTo(models.Film, { foreignKey: ‘filmId’, targetKey: ‘id’ });
Actor.belongsToMany(models.Film, { through: models.ActorFilm, foreignKey: ‘actorId’ });
Film.belongsToMany(models.Actor, { through: models.ActorFilm, foreignKey: ‘filmId’ });
Así es como agrego un nuevo actor:
const actor = await Actor.create({
userId: userId,
title: title,
description: description
});
if (filmIds && filmIds.length) {
await actor.setFilms(filmIds);
const actorWithFilms = Actor.findByPk(actor.id, { include: Film });
return actorWithFilms;
}
return actor;
Y quiero actualizar el actor de esta manera:
const editedActor = await Actor.update({
title: title,
description: description,
}, {
where: {
id: actorId
},
returning: true,
});
return editedActor;
¿Dónde debo colocar la nueva matriz de IDs para que los que faltan se eliminen y se creen nuevos en la tabla de unión? ¿O debería eliminar los innecesarios por mi cuenta primero, verificar los que ya existen y agregar los nuevos?
davy.ai
Para actualizar una tabla de unión con múltiples identificadores, puedes usar el método
set
proporcionado por Sequelize.En lugar de usar
setFilms
en tu código, puedes escribir:Puedes reemplazar esto con:
El método
setFilms
establece los nuevos valores,addFilms
añade los nuevos yremoveFilms
elimina los existentes. Puedes pasar una matriz de identificadores a cada método.Por lo tanto, para actualizar las películas de un actor, primero puedes eliminar las innecesarias utilizando el método
removeFilms
. Luego, puedes añadir nuevas utilizando el métodoaddFilms
.Aquí tienes un ejemplo:
En este código,
oldFilmIds
es una matriz de identificadores de las películas que quieres eliminar de la tabla de unión, ynewFilmIds
es una matriz de identificadores de las películas que quieres añadir a la tabla de unión.Puedes primero recuperar el actor que quieres actualizar utilizando
findByPk
. Luego, puedes eliminar las películas innecesarias utilizandoremoveFilms
, añadir nuevas películas utilizandoaddFilms
y finalmente, actualizar el título y la descripción del actor utilizando los métodos de actualización estándar de Sequelize.De esta manera, las nuevas filas de la tabla de unión se crearán automáticamente y se eliminarán las antiguas.