es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    await actor.setFilms(filmIds);
    

    Puedes reemplazar esto con:

    await actor.setFilms(filmIds);
    await actor.addFilms(newFilmIds);
    await actor.removeFilms(oldFilmIds);
    

    El método setFilms establece los nuevos valores, addFilms añade los nuevos y removeFilms 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étodo addFilms.

    Aquí tienes un ejemplo:

    const editedActor = await Actor.findByPk(actorId);
    
    if (editedActor) {
      await editedActor.removeFilms(oldFilmIds);
      await editedActor.addFilms(newFilmIds);
    
      editedActor.title = title;
      editedActor.description = description;
    
      await editedActor.save();
    }
    
    return editedActor;
    

    En este código, oldFilmIds es una matriz de identificadores de las películas que quieres eliminar de la tabla de unión, y newFilmIds 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 utilizando removeFilms, añadir nuevas películas utilizando addFilms 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.

Comments are closed.