Estoy tratando de definir alguna asociación M:N específica usando Sequelize v6.20.1 y me enfrento a un problema...
Tengo 2 modelos, un modelo de Account y un modelo de Group . Mis reglas sobre estos modelos son las siguientes:
Aquí está la definición de código de todos los modelos y asociación:
const Sequelize, { Model, DataTypes } = require('sequelize'); const sequelize = new Sequelize({ dialect: 'sqlite', storage: `./database.sqlite`, }); /* ----- Account model ----- */ class Account extends Model { // Some account's methods definitions... } Account.init({ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, }, name: DataTypes.STRING, username: DataTypes.STRING, email: DataTypes.STRING, password: DataTypes.STRING, }, { sequelize }); /* ----- Group model ----- */ class Group extends Model { // Some group's methods definitions... } Group.init({ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, }, name: DataTypes.STRING, }, { sequelize }); /* ----- AccountGroup model ----- */ class AccountGroup extends Model { } AccountGroup.init({ AccountId: { type: DataTypes.INTEGER, references: { model: Account, key: 'id', }, onDelete: 'RESTRICT', }, GroupId: { type: DataTypes.INTEGER, references: { model: Group, key: 'id', }, allowNull: false, onDelete: 'CASCADE', }, }, { sequelize, timestamps: false, }); /* ----- Association definition ----- */ Account.belongsToMany(Group, { through: AccountGroup }); Group.belongsToMany(Account, { through: AccountGroup }); sequelize.authenticate(); sequelize.sync({ force: true }; (async () => { const group = new Group({ name: 'Group' }); await group.save(); const account = new Account({ name: 'Doe', username: 'John', email: 'john.doe@example.com', password: 'secret' }); account.addGroup(group); await account.save(); // some processing code... await account.destroy(); })(); Después de que account.destroy() finaliza, la fila AccountGroup se elimina con éxito, pero no el grupo. Y quiero eliminar grupos sin referencia.
Qué me estoy perdiendo ?
Esta es la forma en que funciona la eliminación en cascada. En su ejemplo, cuando se elimina la cuenta, las filas en la tabla AccountGroup ahora pueden tener un valor no válido en su columna de clave externa AccountId. Le está diciendo a la base de datos que cuando ocurra esta situación, elimine el grupo de cuentas por completo. De manera similar, si elimina un grupo, esto se reducirá en cascada y eliminará cualquier grupo de cuentas con ese grupo como su GroupId.
Este problema no surge para las tablas de cuentas o grupos cuando se elimina un grupo de cuentas. No contienen ninguna clave externa que se haya invalidado.
Para encontrar la funcionalidad que está buscando, eliminando cualquier grupo que ya no pertenezca a un grupo de cuentas, es probable que desee colocar una consulta separada en su código, o puede usar un Hook para ejecutarlo después de que se haya creado una cuenta. eliminado