J'ai la table Product
avec les colonnes suivantes [id, name, CategoryId]
et la table Category
avec [id, name]
Modèle du produit:-
module.exports = function(sequelize, DataTypes) {
var Product = sequelize.define('Product', {
name: DataTypes.STRING
}, {
associate: function(models) {
Product.belongsTo(models.Category);
}
});
return Product
}
Modèle de catégorie: -
module.exports = function(sequelize, DataTypes) {
var Category = sequelize.define('Category', {
name: { type: DataTypes.STRING, allowNull: false }
}, {
associate: function(models) {
Category.hasMany(models.Product, { onDelete: 'cascade' });
}
});
return Category
}
lorsque je supprime une catégorie, il supprime uniquement la catégorie, pas les produits correspondants qui lui sont associés. Je ne sais pas pourquoi cela se passe?
mise à jour: Sequelize Version sequelize 1.7.0
=============================================== ============================= Réponse (Comment cela est-il corrigé?): -
J'ai accompli cela en ajoutant une contrainte sur la base de données à l'aide de la commande Alter
, car Add Foreign Key Constraint
à migration
est ouvert bug in sequelize
.
ALTER TABLE "Products"
ADD CONSTRAINT "Products_CategoryId_fkey" FOREIGN KEY ("CategoryId")
REFERENCES "Categories" (id) MATCH SIMPLE
ON DELETE CASCADE
Je crois que vous êtes censé mettre onDelete dans le modèle Category au lieu de dans le modèle Products.
module.exports = function(sequelize, DataTypes) {
var Category = sequelize.define('Category', {
name: { type: DataTypes.STRING, allowNull: false }
}, {
associate: function(models) {
Category.hasMany(models.Product, { onDelete: 'cascade' });
}
});
return Category
}
À partir de "sequelize": "^ 3.5.1", il ne fonctionne que si vous mettez onDelete='CASCADE'
dans la déclaration belongsTo
, qui est le modèle Product
dans votre cas. Cela contredit les documents: http://sequelize.readthedocs.org/fr/latest/api/associations/index.html?highlight=onDelete#hasmanytarget-options
S'il vous plaît voir cette question: Sequelize onDelete ne fonctionne pas
Je suis sur Sequelize 4.38.0.
Je devais mettre onDelete: 'CASCADE'
non seulement sur la définition de l'association, mais également dans le fichier de migration.
// in models/user.js
User.associate = models => {
User.belongsTo(models.Organization, {
foreignKey: { name: 'organizationId', allowNull: true },
onDelete: 'CASCADE',
})
}
// in migrations/create-users.js
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('Users', {
// other fields...
organizationId: {
type: Sequelize.INTEGER,
allowNull: true,
onDelete: 'CASCADE',
references: {
model: 'Organizations',
key: 'id',
as: 'organizationId',
},
},
})
},
J'ai finalement pensé que cela ne fonctionnait pas pour moi à cause de la paranoïa. Sequelize ne gère pas cascade
et effectue une suppression cascade de MySQL. Cela dit, si vous utilisez paranoïaque avec vos tables, la cascade ne se produira pas car les enregistrements ne sont pas vraiment supprimés de la table.