【发布时间】:2021-07-03 20:40:34
【问题描述】:
我正在尝试正确设置我的 Sequelize 关联,以便在我提出请求时提取我的所有“包含”数据。我已经在文档中看到了与此相关的信息,但是如果没有在应用程序中看到它有点难以理解。
我以前有关联,但他们从未提取外键值,我只有在 API 中“包含所有”。我现在在数据拉取开始时有更具体的“包括:[”articleType”]。由于我在没有迁移的情况下工作,我不确定我是否正确更新了 pgAdmin(我只将外键放入我的由于唯一约束错误,不允许从主键中创建外键)。
理想情况下,我只想让我的后端 API 以最有效的方式提取外键值,因为我不知道哪里出错了。我没有迁移,因为这只是一个项目,所以如果信息没有在 Pgadmin 中重复,这可能是一个原因。
首先在 PGadmin 中我应该如何反映我在模型中的约束?这些可以手动完成吗?我看不到 manyToMany、belongTo 等,只有简单的外键限制到另一个表上的主键。
其次,在我的以下模型上,我需要在两个相关模型上声明键吗?在 PGadmin 中,我无法在主键上声明外键,而它从另一个表到主键工作正常。
是否有办法手动添加 SQL 连接,即使使用 Sequelize,以便在 JSON 中包含正确的外键值?我以前有使用 PHP / PHPmyAdmin 的经验,并且使用它要容易得多。从我可以看到我的文章模型在 Pgadmin 和我的后端文件中引用 articleType 模型,并且我还在我的控制器 API 中引用它们(这似乎导致错误,因为其他 API 在没有“包含”的情况下正常工作" 方法中的一部分)。
文章模型
const article = sequelize.define("articles", {
articleID: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
articleTitle: {
type: Sequelize.TEXT
},
articleContent: {
type: Sequelize.TEXT
},
photos: {
type: Sequelize.TEXT
},
userID: {
type: Sequelize.INTEGER
},
articleTypeID: {
type: Sequelize.INTEGER
}},
{
timestamps: false
}, {});
article.associate = function(models) {
article.hasMany(models.articleType, {
foreignKey: "articleTypeID",
as: "articleType_FK"});
article.hasMany(models.userLogin, {
foreignKey: "userID",
as: "userLogin_FK"});
}
return article;
articleType 模型
const articleType = sequelize.define("articleTypes", {
articleTypeID: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false,
},
articleType: {
type: Sequelize.TEXT
}},
{
timestamps: false
},{});
articleType.associate = function(models) {
articleType.belongsTo(models.article, {
foreignKey: "articleTypeID",
as: "article",
});
}
return articleType;
}
物品控制器
exports.articleList = (req, res) => {
// article.findByPk(articleID, { include: ["articleType"] });
article.findAll({
**include: [{ model: articleType, as: 'fki_articleType_FK'},
{ model: userLogin, as: 'fki_userID_FK'}]
})**
.then((article) => {
const articleList = [];
更新
我之前在模型文件夹中的 index.js 文件中创建了许多关联,但现在我只在实际模型中拥有这些关联。这两个都需要放吗?
【问题讨论】:
-
您已将关系别名为“articleType_FK”,请改为在包含中尝试
-
我已经更改了它,我得到了一个“文章中不存在别名为 \"articleType_FK\" 的消息关联”。
-
你能展示你的models/index.js的样子吗?问题可能是关联未初始化,因此 Sequelize 不知道您的模型之间的关联是什么 ||||||另外请添加您现在获得的最新错误快照。
-
另外,请在所有 sequelize.define |||| 中删除模型名称中的“s”
const articleType = sequelize.define("articleType", {&const article = sequelize.define("article", {||||||我认为在进行此更改后它会正常工作 -
我的索引文件和模型中都需要关联吗?我是否需要再次运行 Sequelize sync true 以便这些反映在 pgAdmin 中?我没有迁移,所以这些不会自动更新。
标签: node.js sequelize.js postman