我的类别表有一个外键:name_id
引用了id
表中的translation
,现在类别和翻译具有one to one
关系。
我想添加一个onDelete CASCADE
,所以当我删除类别时,翻译也将被删除。
const Translation = sequelize.define('Translation',
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
en: DataTypes.STRING(1000),
es: DataTypes.STRING(1000),
pt: DataTypes.STRING(1000)
}
)
const Category = sequelize.define('Category',
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
nameId: DataTypes.INTEGER
}
)
Category.belongsTo(Translation, { as: 'name', foreignKey: 'nameId', onDelete: 'cascade' })
Translation.hasOne(Category, { foreignKey: 'nameId', onDelete: 'cascade' })
有什么我想念的吗?
P.S。其他表也将与翻译相关,这就是为什么将外键放在类别中而不是相反的原因。
答案 0 :(得分:0)
您的联系是错误的!有了这样的关联定义,您将获得以下方案:
+----------+
| Category |
+----------+
| id |
+----------+
| nameId |
+----------+
+-------------+
| Translation |
+-------------+
| id |
+-------------+
| en |
+-------------+
| es |
+-------------+
| pt |
+-------------+
| nameId | <-- references Category.id
+-------------+
因此,您的cascade
正常工作,但是在删除Categories
时它将删除孤立的Translation
。要实现您的目标,您必须像这样定义关联:
Category.hasOne(Translation, { as: 'name', foreignKey: 'nameId', onDelete: 'cascade' })
Translation.belongsTo(Category, { foreignKey: 'nameId', onDelete: 'cascade' })
编辑:如果您有多个包含翻译的表格,则需要删除belongTo
关联。每个表中只有hasOne
,例如:
Category.hasOne(Translation, { as: 'name', foreignKey: 'nameId', onDelete: 'cascade' });
Event.hasOne(Translation, { as: 'description', foreignKey: 'descriptionId', onDelete: 'cascade' });