我的Product
表包含以下列[id, name, CategoryId]
和Category
表格[id, name]
产品型号: -
module.exports = function(sequelize, DataTypes) {
var Product = sequelize.define('Product', {
name: DataTypes.STRING
}, {
associate: function(models) {
Product.belongsTo(models.Category);
}
});
return Product
}
类别模型: -
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
}
当我删除类别时,它仅删除类别而不删除与其关联的相应产品。我不知道为什么会这样吗?
更新:
续集版本sequelize 1.7.0
=============================================== ================================= 答案(我如何修复。): -
我通过使用Alter
命令在数据库中添加约束来完成此操作,因为Add Foreign Key Constraint
到migration
在sequelize
中是一个开放的bug。
ALTER TABLE "Products"
ADD CONSTRAINT "Products_CategoryId_fkey" FOREIGN KEY ("CategoryId")
REFERENCES "Categories" (id) MATCH SIMPLE
ON DELETE CASCADE
答案 0 :(得分:27)
我相信你应该把onDelete放在Category模型而不是产品模型中。
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
}
答案 1 :(得分:12)
从#34; sequelize":" ^ 3.5.1",它只适用于onDelete='CASCADE'
声明中的belongsTo
{在你的情况下{1}}模型。这与文档相矛盾:http://sequelize.readthedocs.org/en/latest/api/associations/index.html?highlight=onDelete#hasmanytarget-options
答案 2 :(得分:2)
我正在使用Sequelize 4.38.0。
我不仅要在关联定义中添加onDelete: 'CASCADE'
,还要在迁移文件中添加>
// 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',
},
},
})
},
答案 3 :(得分:1)
在hasMany
关联上,添加onDelete
级联并像这样将钩子设置为true
Category.hasMany(models.Product, { onDelete: 'cascade', hooks:true });
答案 4 :(得分:0)
我终于发现,由于偏执,它对我不起作用。 Sequelize不处理cascade
,而是MySQL级联删除。话虽如此,如果您对表使用偏执狂-级联将不会发生,因为记录并未真正从表中删除。
答案 5 :(得分:0)
这里的问题是生成了一些时间迁移脚本,其中缺少CONSTRAINT
的{{1}}。
我仍在关注foreign key
的问题{@ 3}}。
这是我的解决方法:
步骤1:照常创建迁移文件,但尚未创建{ onDelete: 'cascade', hooks: true }
。请记住像您一样定义foreign key
associate
第2步:创建迁移脚本,将 Product.belongsTo(models.Category);
Category.hasMany(models.Product);
列添加到表中:
foreign key
希望获得帮助!
我通过结合以下方法找到了该解决方案:
答案 6 :(得分:0)
OP的答案已添加到问题中:
我通过使用
Alter
在数据库上添加约束来实现这一点 命令,因为Add Foreign Key Constraint
至migration
是一个 在sequelize
中打开[bug] [1]。ALTER TABLE "Products" ADD CONSTRAINT "Products_CategoryId_fkey" FOREIGN KEY ("CategoryId") REFERENCES "Categories" (id) MATCH SIMPLE ON DELETE CASCADE
答案 7 :(得分:0)
我不知道为什么,但这 {onDelete: 'cascade', hooks: true}
对我不起作用。
如果您遇到同样的问题,请尝试在模型的迁移文件中添加 reference
相关代码。
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable("TravelDetails", {
id: {
......
},
event_id: {
type: Sequelize.INTEGER,
onDelete: "CASCADE",
references: {
model: "Events",
key: "id",
as: "eventData",
},
},
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable("TravelDetails");
},
};
答案 8 :(得分:0)
我无法管理最新的“续集”:“^6.6.5”关联级联以使用此处提到的任何提示处理现有的 postgres 数据库,因此必须将其替换为模型 beforeDestroy
钩子,如下所示< /p>
User.beforeDestroy(async user => {
await Role.destroy({ where: { userId: user.id } })
})