我的类别表有一个外键: name_id
,它被引用到translation
表的id
,现在类别和翻译具有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。其他表也将与翻译有关,这就是为什么外键分类而不是相反的原因。
您的协会在错误的一侧!通过这种关联定义,您将获得以下方案:
+----------+
| Category |
+----------+
| id |
+----------+
| nameId |
+----------+
+-------------+
| Translation |
+-------------+
| id |
+-------------+
| en |
+-------------+
| es |
+-------------+
| pt |
+-------------+
| nameId | <-- references Category.id
+-------------+
因此,您的cascade
正在工作,但是当掉落Translation
时,它将删除孤立的Categories
。为了实现您寻求的目标,您必须这样定义您的关联:
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' });