node.js - 保存 Sequelize 记录/在另一个模型中引用它
问题描述
我有一个名为 的 postrgresql/Sequelize 模型Segment
,它属于许多模型:
module.exports = (sequelize, DataTypes) => {
const Segment = sequelize.define(
'segment',
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
provider_id: {
type: DataTypes.INTEGER,
references: {
model: 'provider',
key: 'id'
}
},
summary_id: {
type: DataTypes.INTEGER,
references: {
model: 'summary',
key: 'id'
}
},
audience_id: {
type: DataTypes.INTEGER,
references: {
model: 'audience',
key: 'id'
}
},
onboarding_id: {
type: DataTypes.INTEGER,
references: {
model: 'onboarding',
key: 'id'
}
}
},
{
// disable the modification of table names; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
// if you don't want that, set the following
freezeTableName: true,
tableName: 'segment'
}
);
Segment.associate = models => {
Segment.belongsTo(models.Provider, { foreignKey: 'id' });
Segment.belongsTo(models.Summary, { foreignKey: 'id' });
Segment.belongsTo(models.Audience, { foreignKey: 'id' });
Segment.belongsTo(models.Onboarding, { foreignKey: 'id' });
};
return Segment;
};
细分与(即provider_id
, summary_id
, audience_id
, onboarding_id
)关联的模型如下所示:
提供者:
module.exports = (sequelize, DataTypes) => {
const Provider = sequelize.define(
'provider',
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
providerName: {
type: DataTypes.STRING
},
email: {
type: DataTypes.STRING
},
privacyPolicy: {
type: DataTypes.STRING
}
},
{
freezeTableName: true,
tableName: 'provider'
}
);
Provider.associate = models => {
Provider.hasMany(models.Segment, { foreignKey: 'provider_id' });
};
return Provider;
};
概括:
module.exports = (sequelize, DataTypes) => {
const Summary = sequelize.define(
'summary',
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
summaryName: DataTypes.STRING,
standardIdName: DataTypes.STRING,
description: DataTypes.STRING,
},
{
freezeTableName: true,
tableName: 'summary'
}
);
Summary.associate = models => {
Summary.hasMany(models.Segment, { foreignKey: 'summary_id' });
};
return Summary;
};
观众:
module.exports = (sequelize, DataTypes) => {
const Audience = sequelize.define(
'audience',
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
refreshCadence: DataTypes.STRING,
sourceLookbackWindow: DataTypes.STRING
},
{
freezeTableName: true,
tableName: 'audience'
}
);
Audience.associate = models => {
Audience.hasMany(models.Segment, { foreignKey: 'audience_id' });
};
return Audience;
};
入职:
module.exports = (sequelize, DataTypes) => {
const Onboarding = sequelize.define(
'onboarding',
{
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
onboardingExpansions: DataTypes.STRING,
onboardingAudiencePrecision: DataTypes.STRING
},
{
freezeTableName: true,
tableName: 'onboarding'
}
);
Onboarding.associate = models => {
Onboarding.hasMany(models.Segment, { foreignKey: 'onboarding_id' });
};
return Onboarding;
};
我的问题是:创建和保存段记录时应该首先考虑什么?我是否首先创建并保存每个其他模型(提供者、摘要、受众、入职),然后创建/保存引用这些 ID 的细分?我真的不知道在这种情况下事件的顺序应该是什么。任何帮助深表感谢!谢谢!
解决方案
- TLDR:
为了创建 的实例Segment
,您必须让所有 4 个外键引用被引用表(、、和)上provider
的summary
现有记录audience
。onboarding
- 解释:
provider
, summary
,audience
和onboarding
表是独立的。
但是,Segment
模型不是独立的。
Segment
模型有 4 列是外键。
外键是表中的一个字段或一组字段,用于唯一标识另一个表中的一行。换句话说,一个表中定义了一个外键,它引用了另一个表的主键。
包含外键的表称为引用表或子表。外键引用的表称为被引用表或父表。
这意味着外键是列应该引用被引用表的主键的约束。
因此,您必须创建一个已创建行的所有资源Segment
。
推荐阅读
- mysql - 如何修复 PUT,错误 500 id = undefined ReactJs NodeJs
- jquery - 对 jquery 数据表进行分页
- java - 如何在后台执行服务并检查其状态
- vb.net - 数字思维插入点
- java - 尝试使用数组列表查看用户填写了多少编辑文本
- c++ - C++20 `constinit` 可以免除对漂亮反制成语的需要吗?
- bluestacks - 使用多实例时,是否可以自动启动应用程序?
- php - Wordpress template_redirect 重定向太多次
- gitlab-ci-runner - 如何使用作业 API 检查跑步者当前是否正在运行作业
- python - 在这种情况下如何编写 __str__ func?